如何解决将整数转换为字节数组会产生意外结果
好的...这似乎是一个相当简单的问题,但我不知道这是怎么回事。我有以下代码将整数转换为字节数组并测试输出:
#include <stdio.h>
void int2bytearray(char *byte_array,int size,int num)
{
for (int i = 0; i < size; i++)
{
byte_array[i] = (num >> 8*i) & 0xFF;
}
}
int main()
{
int test_int = 657850;
int size = sizeof(int);
printf("Size is %d\n",size);
printf("Size of char is %d\n",(int)sizeof(char));
char test_array[size];
printf("Size of first entry %d\n",(int)sizeof(test_array[0]));
int2bytearray(test_array,size,test_int);
for (int i=0; i < size; i++)
{
printf("%#02x",test_array[i]);
}
printf("\nFirst byte is %#.2X",test_array[0]);
return 0;
}
我希望main返回一个 bytes 数组,但是第一个“ byte”似乎是32位整数。
不幸的是,我得到以下输出:
Size is 4
Size of char is 1
Size of first entry 1
0xffffffba0x90xa00
First byte is 0XFFFFFFBA
有人可以告诉我为什么第一个字节打印为0XFFFFFFBA
吗?为什么它是32位整数而不是定义的字节?
解决方法
问题与使用的类型以及如何打印值有关。
数组中的第一个元素的值为0xBA
,作为有符号char
的十进制值为-70。当此值传递给printf
时,它将转换为类型int
,因此,现在您有了一个32位值-70,其表示形式为0XFFFFFFBA
,然后使用%X将其打印出来。以十六进制打印 unsigned int
。
有两种解决方法。
首先,将test_array
的类型更改为unsigned char
。然后,存储的值将为正并正确打印。另一种选择是使用%hhX
作为格式说明符,该说明符声明将值打印为unsigned char
,该值将打印适当的位数。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。