[英]C print hex bytes
我在C程序中有要迭代的十六進制數據的代碼,例如打印出每個十六進制字節:
char input[] = "\x31\xd2\xb2\x30";
for (int i = 0; i < strlen(input); i++) {
printf("%02X\n", input[i]);
}
但是,輸出不是我期望的,例如上面的打印:
31
FFFFFFD2
FFFFFFB2
30
我也嘗試將輸出強制轉換為(unsigned int)
,但是我收到相同的輸出。
有人可以指出這個簡單腳本的問題嗎?
傳遞給printf的參數是符號擴展的,除非您將其強制轉換為如下所示的無符號類型:
printf("%02X\n", (unsigned char)input[i]);
printf("%02X")
需要一個無符號整數; 傳遞型的負值char
(和0xD2
類型的char
是負值)將導致促進負char值到一個32位的無符號整型,從而填充了前導比特與1
和屈服0xFFFFFFD2
到底。 然后將其打印出來。
為了克服這個問題,您可以“告訴” printf
以提供的值作為8位值:
printf("%02hhX\n", input[i])
另一個選擇是將input
聲明為unsigned char
,因為0xD2
不會被視為“負”,並且0xD2
32位將按預期工作:
unsigned char input[] = "\x31\xd2\xb2\x30";
請注意,然后strlen
將需要強制轉換輸入,即strlen((char*)intput)
。
char input[]
必須是unsigned char input[]
。 這就是存儲二進制字節的方式。
// You can use like this
char input[] = "\x31\xd2\xb2\x30";
for (int i = 0; i < strlen(input); i++) {
printf("%02X\n", input[i] & 0xff);
}
Output:
31
D2
B2
30
它將掩蓋高位,僅保留低8位。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.