我的C程序采用随机int高值并将其转换为十六进制并将其写入文件。如果值为225919或更低,一切顺利
例如。 225875是00 03 72 53
但是如果值高于225919,它开始为十六进制值示例885943中的最后一个字节写ffffff
00 03 72 ffffff97
,而正确值为00 03 72 97
}。
将值写入文件的代码如下:
char *temp = NULL;
int cze = 225943;
temp = (char *)(&cze);
for (ii = 3; ii >= 0; ii--) {
printf(" %02x ", temp[ii]); //just for printing the values
fprintf(in, "%02x", temp[ii]);
}
输出为:00 03 72 ffffff97
预期输出:00 03 72 97
请帮助,任何指针都表示赞赏。
答案 0 :(得分:5)
您的temp
数组包含char
个值,在大多数情况下,这些值表示signed char
。然后将这些值打印为带符号char
s,因此任何大于0x7f
的字节都被视为负值。当该值传递给printf
时,它会隐式转换为int
。如果数字为负数,则会添加一个或多个包含所有1
位的字节。
将数据类型更改为unsigned char
。这会导致隐式促销更改为unsigned int
,您将获得正确的值。
unsigned char *temp=NULL;
int cze=225943;
temp=(unsigned char *)(&cze);
for(ii=3;ii>=0;ii--){
printf(" %02x ",temp[ii] );//just for printing the values
fprintf(in,"%02x",temp[ii]);
}
或者,您可以使用hh
中的printf
长度修饰符,该修饰符告诉它参数为char
或unsigned char
。这将限制它打印1个字节的数据。
printf(" %02hhx ",temp[ii] );