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
相关产品推荐
相关产品推荐

