将数组与整数打印为十六进制
Printing array vs. integer as hex
我正在使用一个使用结构来表示数组的API(并允许在访问结构时填充该数组)。
如果数据是结构对象,方向是uint32_t,请运行以下命令:
printf("0x%08X", data->magic);
我得到的值:0xAAAABEEF
直接按原样打印数组时:
printf("0x");
for (int i = 0; i < size; ++i) {
printf("%02X", payload[i]);
}
我得到的值:0xEFBEAAAA
结构定义如下所示:
struct Data {
uint32_t magic;
} __attribute__((packed));
我相信数据变量是这样声明的:
// Declared and initialized somewhat like this:
uint8_t payload[kMaxSize];
Data* data = reinterpret_cast<Data*>(payload);
data->magic = 0xAAAABEEF;
我很好奇为什么 printf 不返回相同的值。是因为机器将数据存储为 LSB(最低有效字节)吗?
你的猜测是正确的。 在小端序处理器(例如:x86)中,最低有效字节首先存储在内存中。 因此,0xAAAABEEF
数字将作为四个字节存储在内存中:{0xEF, 0xBE, 0xAA, 0xAA}
当程序查看内存中的这四个字节时,数据的解释方式(其类型)决定了它的外观。 如果{0xEF, 0xBE, 0xAA, 0xAA}
被解释为单个字节,则得到"EF BE AA AA"。 但是如果它被解释为uint32_t
,那么计算机知道颠倒顺序并将其显示为"0xAAAABEEF"。
相关文章:
- 读取文件中所有可能的十六进制 16 字节序列并打印每个序列
- C ++如何使用UTF8十六进制代码打印UTF8符号?
- 打印十六进制字符
- 编译器始终打印十六进制/八进制数字
- 在 c++ 中以十六进制格式打印无符号字符(BYTE).使用 std::cout
- 以十六进制打印出 DWORD 会在 win32 c++ 中返回0x7FFFFFFF
- 将长整型值打印为带有前导零的十六进制
- C++ 在地板函数之后以十六进制打印数字
- 如何使系统在十六进制数之前打印 0x,在八进制数之前打印 0?
- 打印出浮点数的内部十六进制
- 为什么 std::hex 没有特别用字符打印为十六进制?
- 我如何在GDB中打印十六进制的双重位
- C/C++ 以十六进制打印字节,得到奇怪的十六进制值
- 尝试将二进制数组转换为十六进制C++然后打印结果
- 如何从uint32_t打印十六进制
- 用IO操纵器在十六进制中打印一个8位号码
- 将内存地址中的值打印为十六进制C++
- fprintf:打印文字十六进制字符串
- 将十六进制转换为可打印的字符串/字符
- 以十六进制打印数据结构值