[英]C/C++ Printing bytes in hex, getting weird hex values
我正在使用以下內容從十六進制數組中打印出數字:
char buff[1000];
// Populate array....
int i;
for(i = 0; i < 1000; ++i)
{
printf("[%d] %02x\n", i,buff[i]);
}
但是我有時會打印出奇怪的值:
byte[280] 00
byte[281] 00
byte[282] 0a
byte[283] fffffff4 // Why is this a different length?
byte[284] 4e
byte[285] 66
byte[286] 0a
為什么打印“ fffffff4”?
使用%02hhx
作為格式字符串。
從CppReference中 , %02x
接受unsigned int
。 當您將參數傳遞給可變參數函數 printf()
, buff[i]
將自動轉換為int
。 然后,格式說明符%02x
使printf()
將該值解釋為int
,因此可能的負值(char)-1
如(char)-1
被解釋並打印為(int)-1
,這就是您所觀察到的原因。
也可以推斷出您的平台已簽名char
類型和32位int
類型。
長度修飾符hh
將告訴printf()
解釋以char
類型提供的任何內容,因此%hhx
是unsigned char
的正確格式說明符。
或者,您可以在打印之前將數據轉換為unsigned char
。 喜歡
printf("[%d] %02x\n", i, (unsigned char)buff[i]);
由於int
可以(幾乎)始終包含unsigned char
值,因此這也可以防止出現負值的時間過長。
請參見以下示例:
#include <stdio.h>
int main(){
signed char a = +1, b = -1;
printf("%02x %02x %02hhx %02hhx\n", a, b, a, b);
return 0;
}
上面程序的輸出是:
01 ffffffff 01 ff
您的平台顯然已簽署了char
。 在char
不帶符號的平台上,輸出將為f4
。
調用可變參數函數時,任何小於int
整數參數都將提升為int
。
一個f4
的char
值( -12
為一個有signed char
)已設置了符號位,因此在您的情況下,轉換為int
時將變為fffffff4
(仍為-12
但現在作為一個有signed int
)。
%x02
使printf
將參數視為unsigned int
,並將使用至少 2個十六進制數字進行打印。 輸出的兩位數不合適,因此使用了所需的位數。
因此輸出fffffff4
。
要解決此問題,請聲明數組unsigned char buff[1000];
否則,請執行以下操作unsigned char buff[1000];
或強制轉換參數:
printf("[%d] %02x\n", i, (unsigned char)buff[i]);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.