我有一个无符号的int数(2字节),我想将它转换为unsigned char类型。从我的搜索中,我发现大多数人建议您执行以下操作:
unsigned int x;
...
unsigned char ch = (unsigned char)x;
是正确的做法吗?我问,因为unsigned char是1个字节,我们从2字节数据转换为1个字节。
为了防止任何数据丢失,我想创建一个unsigned char []数组,并将各个字节保存到数组中。我被困在以下地方:
unsigned char ch[2];
unsigned int num = 272;
for(i=0; i<2; i++){
// how should the individual bytes from num be saved in ch[0] and ch[1] ??
}
另外,我们如何将unsigned char [2]转换回unsigned int 。
非常感谢。
答案 0 :(得分:19)
在这种情况下你可以使用memcpy
:
memcpy(ch, (char*)&num, 2); /* although sizeof(int) would be better */
另外,如何将unsigned char [2]转换回unsigned int。
同样的方法,只需反转memcpy的参数。
答案 1 :(得分:16)
怎么样:
ch[0] = num & 0xFF;
ch[1] = (num >> 8) & 0xFF;
相反的操作留作练习。
答案 2 :(得分:7)
使用联盟怎么样?
union {
unsigned int num;
unsigned char ch[2];
} theValue;
theValue.num = 272;
printf("The two bytes: %d and %d\n", theValue.ch[0], theValue.ch[1]);
答案 3 :(得分:6)
这取决于您的目标:为什么要将其转换为unsigned char
?根据答案,有几种不同的方法可以做到这一点:
截断:这就是推荐的内容。如果您只是想将数据压缩到需要unsigned char
的函数中,只需转换uchar ch = (uchar)x
(当然,要注意如果你的int太大会发生什么)。
特定字节序:当目的地需要特定格式时,请使用此选项。通常网络代码喜欢将所有内容转换为字符串的大端数组:
int n = sizeof x;
for(int y=0; n-->0; y++)
ch[y] = (x>>(n*8))&0xff;
会做到这一点。
Machine endian 。当没有字节顺序要求时使用此选项,并且数据仅在一台计算机上发生。阵列的顺序将在不同的架构中发生变化。人们通常使用union
s来处理这个问题:
union {int x; char ch[sizeof (int)];} u;
u.x = 0xf00
//use u.ch
memcpy
:
uchar ch[sizeof(int)];
memcpy(&ch, &x, sizeof x);
或者使用非常危险的简单转换(未定义的行为,并在许多系统上崩溃):
char *ch = (unsigned char *)&x;
答案 4 :(得分:4)
当然,大到足以包含更大值的字符数组必须与此值本身一样大。 所以你可以简单地假装这个更大的值已经是一个字符数组:
unsigned int x = 12345678;//well, it should be just 1234.
unsigned char* pChars;
pChars = (unsigned char*) &x;
pChars[0];//one byte is here
pChars[1];//another byte here
(一旦你理解了正在发生的事情,它可以在没有任何变量的情况下完成,只需要投射)
答案 5 :(得分:2)
您只需要使用bitwise & operator
提取这些字节。 OxFF
是一个十六进制掩码,用于提取一个字节。请查看此处的各种位操作 - http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/
示例程序如下:
#include <stdio.h>
int main()
{
unsigned int i = 0x1122;
unsigned char c[2];
c[0] = i & 0xFF;
c[1] = (i>>8) & 0xFF;
printf("c[0] = %x \n", c[0]);
printf("c[1] = %x \n", c[1]);
printf("i = %x \n", i);
return 0;
}
输出:
$ gcc 1.c
$ ./a.out
c[0] = 22
c[1] = 11
i = 1122
$