gpt4 book ai didi

c++ - 从文件中读取十六进制,printf %x 显示前导 ff 值

转载 作者:行者123 更新时间:2023-12-02 17:57:45 25 4
gpt4 key购买 nike

我有一个包含 26 个十六进制字节值的文件“data.dat”:

22 49 E1 09 62 18 42 8C 66 10 B0 11 84 9C 00 FF E0 40 1F F8 60 07 FE 2C 03 FF

我正在尝试将这些读入 C++ 并将十六进制值打印到终端:

const int msgbuflen = 26;                
char message [msgbuflen];

const char* filenameIn = "data.dat";

FILE* fpIn = fopen(filenameIn, "rb");

if (!fpIn) {
perror("ERROR: INPUT FILE CANNOT BE OPENED\n");
exit(EXIT_FAILURE);
}

for (i=0; i<msgbuflen; i++){ // clear the buffer
message[i] = '0';
}

size_t ret_code = fread(message, sizeof(unsigned char), msgbuflen, fpIn);
for(int i = 0; i < msgbuflen; i++){
printf("message[%d] : 0x%x\n", i, message[i]);
}

fclose (fpIn);

运行时,某些字节的输出有 3 个前导 ff 值:

message[0] : 0x22
message[1] : 0x49
message[2] : 0xffffffe1
message[3] : 0x9
message[4] : 0x62
message[5] : 0x18
message[6] : 0x42
message[7] : 0xffffff8c
message[8] : 0x66
message[9] : 0x10
message[10] : 0xffffffb0
message[11] : 0x11
message[12] : 0xffffff84
message[13] : 0xffffff9c
message[14] : 0x0
message[15] : 0xffffffff
message[16] : 0xffffffe0
message[17] : 0x40
message[18] : 0x1f
message[19] : 0xfffffff8
message[20] : 0x60
message[21] : 0x7
message[22] : 0xfffffffe
message[23] : 0x2c
message[24] : 0x3
message[25] : 0xffffffff

为什么会出现这些前导 f?例如消息[2]:0xffffffe1

我尝试使用 0x%01x 格式化 printf hex %x 的输出,但这对终端输出没有影响。检查 char 数组中每个元素的大小,它们仍然是预期的 1 个字节:

printf("sizeof(message[2]) : %ld\n", sizeof(message[2]) );

%> sizeof(message[2]) : 1

我现在想知道这是否是格式问题?每个消息元素中似乎不超过 1 个字节(如预期)。

将 std::hex 与 cout 一起使用会产生相同的问题。

最佳答案

这是因为 char 在您的计算机上是有符号整数,因此 0xFF 变为 -1。由于 %x 打印 int(32 位),因此它会被符号扩展为 0xFFFFFFFF(32 位 ) -1.

如果您存储为unsigned char,则不会出现此问题:

#include <cstdio>

int main() {
unsigned char message[] = {0x22, 0x49, 0xE1, 0x09, 0x62, 0x18, 0x42, 0x8C, 0x66, 0x10, 0xB0, 0x11, 0x84, 0x9C, 0x00, 0xFF, 0xE0, 0x40, 0x1F, 0xF8, 0x60, 0x07, 0xFE, 0x2C, 0x03, 0xFF };
int msgbuflen = sizeof(message)/sizeof(message[0]);
for(int i = 0; i < msgbuflen; i++){
printf("message[%d] : 0x%x\n", i, message[i]);
}
}

产品:

Program returned: 0
message[0] : 0x22
message[1] : 0x49
message[2] : 0xe1
message[3] : 0x9
message[4] : 0x62
message[5] : 0x18
message[6] : 0x42
message[7] : 0x8c
message[8] : 0x66
message[9] : 0x10
message[10] : 0xb0
message[11] : 0x11
message[12] : 0x84
message[13] : 0x9c
message[14] : 0x0
message[15] : 0xff
message[16] : 0xe0
message[17] : 0x40
message[18] : 0x1f
message[19] : 0xf8
message[20] : 0x60
message[21] : 0x7
message[22] : 0xfe
message[23] : 0x2c
message[24] : 0x3
message[25] : 0xff

神箭:https://godbolt.org/z/oxPqnYqMq

或者,您可以将每个 char 转换为 unsigned char:

for(int i = 0; i < msgbuflen; i++){
printf("message[%d] : 0x%x\n", i, (unsigned char)message[i]);
}

关于c++ - 从文件中读取十六进制,printf %x 显示前导 ff 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75287905/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com