2012-08-16 46 views
7

我有一個結構,以及指針結構,我希望給printf前n個字節作爲一個長十六進制數,或作爲十六進制字節串。printf的原始數據爲固定長度的十六進制輸出

基本上我需要的printf相當於廣發行的檢查存儲器的命令,X/NXB。

如果可能的話,我想還是用printf作爲節目的記錄功能只是它的變體。更好的是,如果我可以這樣做而不循環數據。

回答

7

剛接手埃裏克Postpischil的意見,並炮製了以下內容:

struct mystruc 
{ 
    int a; 
    char b; 
    float c; 
}; 

int main(int argc, char** argv) 
{ 
    struct mystruc structVar={5,'a',3.9}; 
    struct mystruc* strucPtr=&structVar; 
    unsigned char* charPtr=(unsigned char*)strucPtr; 
    int i; 
    printf("structure size : %zu bytes\n",sizeof(struct mystruc)); 
    for(i=0;i<sizeof(struct mystruc);i++) 
     printf("%02x ",charPtr[i]); 

    return 0; 
} 

它將打印字節FAS的結構延伸。

更新:您的洞察力埃裏克:)我已經更新了代碼感謝。

+2

尺寸應打印爲「%zu」。這是無符號'size_t'類型的格式,它可能與「%d」的簽名'int'類型不同。最好打印帶有「%02x」而不是「%x」的字節。如果值足夠小,後者只打印一位數字。 – 2012-08-16 18:45:02

1

試試這個。假設你有指向pstruct中的struct的指針。

unsigned long long *aslong = (unsigned long long *)pstruct; 
printf("%08x%08x%08x%08x%08x%08x%08x%08x", 
     aslong[0], 
     aslong[1], 
     aslong[2], 
     aslong[3], 
     aslong[4], 
     aslong[5], 
     aslong[6], 
     aslong[7], 
); 

正如Eric指出的那樣,這可能會打亂字節亂序。所以它可以是這個,或者使用unsigned char *和(具有帶64個參數的printf或使用循環)。

+3

這應該使用'unsigned char'。可能會對'char'進行簽名,在這種情況下,傳遞給printf時發生的對int的提升將導致負值顯示爲32位負值。例如,字節0xff將被打印爲「ffffffff」。另外,「%02x」是一種更好的格式,因爲您可能需要前導零而不是空格。 – 2012-08-16 18:12:48

+0

這個解決方案的問題是我需要打印64個字節,而不是3個。 – rhlee 2012-08-16 18:26:16

+0

@EricPostpischil:感謝您的評論。無符號的確是要走的路,而'0'也是。 – Claudiu 2012-08-16 18:34:22

相關問題