C++随手记---16进制输入问题

随手记

 

c++读取文件时,以16进制输出时,发现这么一个坑:

 

文件的16进制内容:

C++随手记---16进制输入问题

 

读取的代码:

 

void readDst(){
	int i;
	ifstream infile("3303.dst",ios::binary);
	assert(infile.is_open());

	streampos  pos  = infile.tellg();
	infile.seekg(0, ios::end); 
	    
    //获取文件长度
    int fileLen = infile.tellg(); 

    infile.clear();
    infile.seekg(0);
  

	string s;
	char *str = new  char[fileLen-HEAD_MESS_LEN];
	infile.read(str,fileLen-HEAD_MESS_LEN);
  
	i = HEAD_MESS_LEN;

   //读取文件
	while(i<fileLen)
	{
	    printf("%x\t",str[i]);
		i++;
	}

	printf("\n");
	infile.close();

}

 

输出结果:

C++随手记---16进制输入问题

 

发现 文件中的 a2 读出来时变成了 ffffffa2,调试了一下,发现 输出前 其在内存中的16进制值也是正确的,故推测是输出函数的问题。尝试  printf("%2x\t",str[i]);  和  printf("%02x\t",str[i]); ,格式化输出还是没有效果。

最后看到网上的一篇文章才找到原因:

字符型变量值的二进制第一位是1,格式输出函数printf中会对所输出的变量做有符号/无符号型的判断。如果是有符号型变量,且该值二进制首位为1,则会按照补码形式前面全置为1,也就是全为f。

所以 只要 加上 unsigned 来声明就好了,如     printf("%x\t",(unsigned char)str[i]);

结果:

C++随手记---16进制输入问题

 

参考链接:http://guhanjie.iteye.com/blog/1765585