内存数据的十六进制Print

在程序的调试过程中,经常需要输出各种数据,正常情况下使用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 buf[i]; // must use unsigned char to print >128 value
        if( c< 16)
        {
            printf("0%x", c);//前面补充一个0
        }
        else
        {
            printf("%x", c);
        }
    }
    printf("\n");
}
int main()
{
    char 'A';
    HexOutput(&c, 1);
    'a';
    HexOutput(&c, 1);
    255;
    printf("\t%x\n", c);
    HexOutput(&c, 1);
    -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;
}


程序输出为:

The Hex outputof data  //char  'A'

        0x41 

The Hex outputof data  // char c=’a’

        0x61

        ffffffff

The Hex outputof data  // char =255 

        0xff

The Hex outputof data  // char -1

        0xff

        ffffffff

The Hex outputof data   // short sc -8;

        0xf8ff

        fffffff8

The Hex outputof data :

       0x0000000000000000000000000000000000000000

The Hex outputof data     // std::string str ="BRSACP";

        0x425253414350

The Hex outputof data     // buf[0] 0xFD; buf[1] =0xFE;

        0xfdfe

The Hex outputof data :

       0xfdfe425253414350000000000000000000000000

The Hex outputof data :

        0x504341535242fefd

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值