在程序的调试过程中,经常需要输出各种数据,正常情况下使用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);//前面补充一个0
}
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;
}
程序输出为:
The Hex outputof data : //char c = 'A'
0x41
The Hex outputof data : // char c=’a’
0x61
ffffffff
The Hex outputof data : // char c =255
0xff
The Hex outputof data : // char c = -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