簡體   English   中英

C / C ++以十六進制打印字節,獲取奇怪的十六進制值

[英]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類型提供的任何內容,因此%hhxunsigned 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

一個f4char值( -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.

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