C - unsigned int to unsigned char array conversion
我有一个无符号的整数(2个字节),我想将其转换为无符号的char类型。 通过搜索,我发现大多数人建议您执行以下操作:
1 2 3 | unsigned int x; ... unsigned char ch = (unsigned char)x; |
是正确的方法吗? 我问是因为unsigned char是1个字节,我们将2个字节的数据强制转换为1个字节。
为了防止任何数据丢失,我想创建一个无符号char []数组并将单个字节保存到该数组中。 我坚持以下几点:
1 2 3 4 5 6 | 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] ?? } |
另外,我们如何将无符号char [2]转换回unsigned int。
非常感谢。
在这种情况下,可以使用
1 |
Also, how would be convert the unsigned char[2] back to unsigned int.
同样,只需反转memcpy的参数即可。
怎么样:
1 2 | ch[0] = num & 0xFF; ch[1] = (num >> 8) & 0xFF; |
相反的操作留作练习。
使用工会如何?
1 2 3 4 5 6 7 8 | union { unsigned int num; unsigned char ch[2]; } theValue; theValue.num = 272; printf("The two bytes: %d and %d ", theValue.ch[0], theValue.ch[1]); |
这实际上取决于您的目标:为什么要将其转换为
-
截断:这是建议的内容。如果您只是试图将数据压缩到需要
unsigned char 的函数中,则只需强制转换uchar ch = (uchar)x (但是,请注意,如果int太大,会发生什么情况)。 -
特定字节序:当目的地需要特定格式时,请使用此格式。通常,网络代码喜欢将所有内容转换为字符的大端字节数组:
1
2
3int n = sizeof x;
for(int y=0; n-->0; y++)
ch[y] = (x>>(n*8))&0xff;会做到的。
-
机器字节序。在没有字节序要求的情况下使用此选项,并且数据将仅在一台计算机上出现。阵列的顺序将在不同的体系结构中改变。人们通常使用
union 来解决此问题:1
2
3union {int x; char ch[sizeof (int)];} u;
u.x = 0xf00
//use u.ch使用
memcpy :1
2或使用非常危险的简单转换(这是不确定的行为,并在许多系统上崩溃):
1char *ch = (unsigned char *)&x;
当然,足够大以包含更大值的字符数组必须与此值本身一样大。
因此,您可以简单地假设这个更大的值已经是一个char数组:
1 2 3 4 5 6 7 | 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 |
(一旦您了解了所发生的情况,就可以在没有任何变量的情况下完成操作,而只需将其全部转换即可)
您只需要使用
示例程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
输出:
1 2 3 4 5 6 | $ gcc 1.c $ ./a.out c[0] = 22 c[1] = 11 i = 1122 $ |