将 unsigned char 数组打印为十六进制
Print unsigned char array to hex
问题
我有一些字节缓冲区,会在 运行 时间内填满。我想使用十六进制代码显示缓冲区的内容。所以这是缓冲区的定义:
enum { max_data_length = 8192 }; //8KB
unsigned char stream_data_[max_data_length];
现在我想打印内容。例如,数据存储如下:
stream_data_[0] = 124;
stream_data_[1] = 198;
stream_data_[2] = 60;
现在我想打印这个缓冲区的内容(十六进制)。我尝试了几个堆栈溢出帖子,但它们都使用 unsigned int 或填充数组。我真的被这个问题困住了!
代码
我试过例如:
enum { max_data_length = 3 }; //8KB
unsigned char stream_data_[max_data_length];
stream_data_[0] = 20;
stream_data_[1] = 30;
stream_data_[2] = 40;
char str[16];
sprintf(str, "%X02 ", stream_data_);
std::cout << str;
但是我不明白为什么每次我运行结果总是不一样。
例如:
C2CA426002
7C92553002
唯一的问题是 iostream 将 unsigned char
视为字符类型,
而不是一个小整数。要解决这个问题,只需在输出之前将 unsigned
char
转换为 unsigned
即可。 (对于其余的:你必须
指定十六进制输出,当然也可能指定宽度和填充字符。)
转储 unsigned char
的数组:
void
dumpArray( unsigned char const* array, int count, std::ostream& dest )
{
dest.setf( std::ios_base::hex, std::ios_base::basefield );
dest.fill( '0' );
while ( count > 0 ) {
dest << std::setw( 2 ) << static_cast<unsigned>( *array );
-- count;
if ( count != 0 ) {
dest << ' ';
}
}
}
(当然,在生产代码中,你会想要保存之前的格式,
并在返回前恢复它。)
问题
我有一些字节缓冲区,会在 运行 时间内填满。我想使用十六进制代码显示缓冲区的内容。所以这是缓冲区的定义:
enum { max_data_length = 8192 }; //8KB
unsigned char stream_data_[max_data_length];
现在我想打印内容。例如,数据存储如下:
stream_data_[0] = 124;
stream_data_[1] = 198;
stream_data_[2] = 60;
现在我想打印这个缓冲区的内容(十六进制)。我尝试了几个堆栈溢出帖子,但它们都使用 unsigned int 或填充数组。我真的被这个问题困住了!
代码
我试过例如:
enum { max_data_length = 3 }; //8KB
unsigned char stream_data_[max_data_length];
stream_data_[0] = 20;
stream_data_[1] = 30;
stream_data_[2] = 40;
char str[16];
sprintf(str, "%X02 ", stream_data_);
std::cout << str;
但是我不明白为什么每次我运行结果总是不一样。 例如:
C2CA426002
7C92553002
唯一的问题是 iostream 将 unsigned char
视为字符类型,
而不是一个小整数。要解决这个问题,只需在输出之前将 unsigned
char
转换为 unsigned
即可。 (对于其余的:你必须
指定十六进制输出,当然也可能指定宽度和填充字符。)
转储 unsigned char
的数组:
void
dumpArray( unsigned char const* array, int count, std::ostream& dest )
{
dest.setf( std::ios_base::hex, std::ios_base::basefield );
dest.fill( '0' );
while ( count > 0 ) {
dest << std::setw( 2 ) << static_cast<unsigned>( *array );
-- count;
if ( count != 0 ) {
dest << ' ';
}
}
}
(当然,在生产代码中,你会想要保存之前的格式, 并在返回前恢复它。)