加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

使用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根本没有列出它.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读