簡體   English   中英

C打印十六進制字節

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM