使用C将十六进制值存储到数组后打印十六进制值
发布时间:2020-12-16 10:00:27 所属栏目:百科 来源:网络整理
导读:我已经从文件中读取并存储为十六进制值(比如第一个值是D4 C3).然后将其存储到char数据类型的缓冲区中.但每当我打印缓冲区时,我得到一个值likebuff [0] = ffffffD4; buff [1] = ffffffC3等. 如何在不添加任何字节的情况下将实际值存储到缓冲区? 附上此代码段
我已经从文件中读取并存储为十六进制值(比如第一个值是D4 C3).然后将其存储到char数据类型的缓冲区中.但每当我打印缓冲区时,我得到一个值likebuff [0] = ffffffD4; buff [1] = ffffffC3等.
如何在不添加任何字节的情况下将实际值存储到缓冲区? 附上此代码段 ic= (char *)malloc(1); temp = ic; int i=0; char buff[1000]; while ((c = fgetc(pFile)) != EOF) { printf("%x",c); ic++; buff[i]=c; i++; } printf("nnNo. of bytes written: %d",i); ic = temp; int k; printf("nBuffer value is : "); for(k=0;k<i;k++) { printf("%x",buff[k]); } 解决方法
默认情况下,char在许多平台上签名(标准并未规定其签名).传递给变量参数列表时,标准扩展如char – > int被调用.如果char是无符号的,则0xd3保持为整数0xd3.如果char被签名,则0xd3变为0xffffffd3(对于32位整数),因为这是相同的整数值-45.
注意,如果你不知道这一点,你应该重新检查整个程序,因为这样的错误是非常微妙的.我用一个只用强制-funsigned-char正常工作的工具处理了make的CFLAGS. OTOH这个标志,如果可以的话,对于这个问题可能是一个快速而肮脏的解决方案(但我建议不再使用它). 我经常使用的方法是传递给printf() – 类似函数的值不是c,而是0xff& c,对于多个版本,它在视觉上易于理解和稳定.您可以考虑使用hh修饰符(UPD:正如@JoachimPileborg已经建议的那样),但我不确定它是否支持所有真正的C版本,包括MS和嵌入式版本. (MSDN根本没有列出它.) (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |