You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++中unsigned char二维数组存储随机8位十六进制数异常问题

解决unsigned char数组随机填充后的输出乱码问题

我希望用rand()函数给一个unsigned char类型的4×4二维数组填充随机8位十六进制数,但输出时出现了乱码(示例如下)。改成int类型数组就正常,但我想保留unsigned char来确保每个元素只存8位数据。

测试代码:

#include <iostream>
#include <iomanip>
#include <string>
#include <cstdlib>
#include <ctime>

using namespace std;

int main()
{
    srand(time(NULL));

    unsigned char key[4][4];

    for (int y = 0; y < 4; y++) 
    {
        for (int x = 0; x < 4; x++)
        {
            key[x][y] = (rand() % 256);
            cout << hex << setfill('0') << setw(2) << key[x][y] << " | ";
        }
        cout << endl;
    }
}

异常输出示例:

0┘ | 0☻ | 0| | 0┌ |
0L | 0ä | 0⌐ | 0ä |
0☺ | 0î | 0X | 0Y |
0▬ | 0╧ | 0@ | 0╩ |

解决方案

1. 修复输出乱码问题

乱码的核心原因是:cout默认将unsigned char当作字符类型解析输出,而非数值。只需要在输出时将其强制转换为整数类型即可:

修改输出语句为:

cout << hex << setfill('0') << setw(2) << static_cast<unsigned int>(key[x][y]) << " | ";

强制转换后,cout会把unsigned char的值以十六进制数值形式输出,而非字符对应的符号。

2. 更好的随机填充方式

rand()函数的随机性较弱,且rand() % 256的分布并不完全均匀(因为RAND_MAX不一定是255的整数倍)。C++11及以后推荐使用标准库<random>组件,安全性和随机性更有保障:

#include <iostream>
#include <iomanip>
#include <random>

using namespace std;

int main()
{
    // 初始化真随机种子与随机数引擎
    random_device rd;
    mt19937 gen(rd());
    // 生成0-255的均匀分布随机数
    uniform_int_distribution<unsigned char> dist(0, 255);

    unsigned char key[4][4];

    for (int y = 0; y < 4; y++) 
    {
        for (int x = 0; x < 4; x++)
        {
            key[x][y] = dist(gen);
            cout << hex << setfill('0') << setw(2) << static_cast<unsigned int>(key[x][y]) << " | ";
        }
        cout << endl;
    }
}

这段代码中:

  • random_device用于获取硬件提供的真随机种子(如果平台支持)
  • mt19937是高性能的Mersenne Twister随机数引擎
  • uniform_int_distribution确保生成的随机数在0-255范围内均匀分布,避免rand()的分布偏差问题

内容的提问来源于stack exchange,提问作者Lachlan

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 09:40:48