記憶體資料的十六進位制Print

linuxheik發表於2016-09-26

在程式的除錯過程中,經常需要輸出各種資料,正常情況下使用 printf 和 cout 即可實現資料輸出。然而在輸出二進位制資料時, printf 和 out 卻有點無能為力。那麼如何比較二進位制資料是否正確呢?

方案一:檔案輸出。檔案可以輸入任何資料,但是需要在程式之外比較檔案,這對於少量資料並不划算。

方案二:實現自定義的十六進位制輸出函式。當然,也可是八進位制,一般而言十六進位制更易看懂 ( 習慣 ) 。下面給出一個最近實現的此類函式。該函式可將指定長度任何記憶體資料以十六進位制格式輸出。 這個程式對 32 和 64 位的 PC 均適用。

注意: %x 無法正確列印負數,負數總是列印成 32bit 整型數, 64 PC 也是如此。 


#include <stdio.h>

#include <string>
void HexOutput(const char* buf, size_t len)
{
    printf("The Hex output of data :\n\t0x");
    for(size_t i=0; i<len; ++i)
    {
        unsigned char c = buf[i]; // must use unsigned char to print >128 value
        if( c< 16)
        {
            printf("0%x", c);
        }
        else
        {
            printf("%x", c);
        }
    }
    printf("\n");
}
int main()
{
    char c = 'A';
    HexOutput(&c, 1);
    c = 'a';
    HexOutput(&c, 1);
    c = 255;
    printf("\t%x\n", c);
    HexOutput(&c, 1);
    c = -1;
    HexOutput(&c, 1);
    printf("\t%x\n", c);
    short sc = -8;
    HexOutput((char*)&sc, 2);
    printf("\t%x\n", sc);
    char buf[20] = {0};
    HexOutput(buf, 20);
    std::string str = "BRSACP";
    HexOutput(str.c_str(), str.size());
    buf[0] = 0xFD; buf[1] = 0xFE;
    HexOutput(buf, 2);
    memcpy(buf+2, str.c_str(), str.size());
    HexOutput(buf, 20);
    long long value = 0xFDFE425253414350LLU;  // LLU or LL is necessary for 32 PC
    HexOutput((char*)&value, 8);
Return 0;
}

相關文章