将无符号字符数组打印为十六进制

Print unsigned char array to hex

本文关键字:十六进制 打印 数组 无符号 字符      更新时间:2023-10-16

问题
我有一些字节缓冲区,在运行时会被填满。我想使用十六进制代码显示缓冲区的内容。这就是缓冲区的定义:

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;

现在我想打印这个缓冲区的内容(十六进制)。我尝试了几个堆栈溢出帖子,但它们都使用了无符号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 << ' ';
        }
    }
}

(当然,在生产代码中,您需要保存以前的格式,并在返回之前将其恢复。)