C++随手记---16进制输入问题
随手记
c++读取文件时,以16进制输出时,发现这么一个坑:
文件的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();
}
输出结果:
发现 文件中的 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]);
结果:
参考链接:http://guhanjie.iteye.com/blog/1765585