Ç - 无符号整数为unsigned char阵列转换(C - unsigned int to un

2019-07-29 03:22发布

我有一个unsigned int数(2字节),我想将其转换为unsigned char类型。 从我的搜索,我发现大多数人建议做到以下几点:

 unsigned int x;
 ...
 unsigned char ch = (unsigned char)x;

是正确的做法? 我问,因为无符号的字符是1个字节,我们从2点字节的数据铸造到1个字节。

以防止任何数据丢失,我想创建无符号字符[]数组和单个字节保存到数组中。 我被困在下面:

 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] ??
 }

此外, 我们将如何转换无符号的字符[2]回unsigned int类型

非常感谢。

Answer 1:

您可以使用memcpy在这种情况下:

memcpy(ch, (char*)&num, 2); /* although sizeof(int) would be better */

此外,如何将转换无符号的字符[2]回unsigned int类型。

用同样的方法,只是反转的memcpy的参数。



Answer 2:

怎么样:

ch[0] = num & 0xFF;
ch[1] = (num >> 8) & 0xFF;

相反的操作是留作练习。



Answer 3:

如何利用工会吗?

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]);


Answer 4:

这真的取决于你的目标:你为什么要将此转换为一个unsigned char ? 根据这个问题的答案有几个不同的方式来做到这一点:

  • 截断 :这是什么recomended。 如果你只是想将数据挤进这需要一个功能unsigned char ,可简单地把uchar ch = (uchar)x (但是,当然,谨防发生什么,如果你的int是太大了)。

  • 具体尾数 :当你的目的地,还需要以特定的格式,请使用此。 通常网络代码喜欢一切转换成字符的大端数组:

     int n = sizeof x; for(int y=0; n-->0; y++) ch[y] = (x>>(n*8))&0xff; 

    会做到这一点。

  • 机端 。 使用此当没有字节顺序要求,数据只将一台机器上出现。 阵列的顺序将跨越不同的体系结构而改变。 人们通常照顾这个与union S:

     union {int x; char ch[sizeof (int)];} u; ux = 0xf00 //use u.ch 

    memcpy

     uchar ch[sizeof(int)]; memcpy(&ch, &x, sizeof x); 

    或与日益危险的简单铸造(这是不确定的行为,并且崩溃在众多系统):

     char *ch = (unsigned char *)&x; 


Answer 5:

当然,字符大到足以容纳一个较大的值的数组必须是完全一样大,这个数值本身。 所以,你可以简单地假装这较大的值已经是字符数组:

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

(一旦你明白这是怎么回事,可没有任何变量做,一切都只是铸造)



Answer 6:

你只需要提取使用这些字节bitwise & operatorOxFF是一个十六进制掩码提取一个字节。 请在不同的位操作看这里- 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 
$


文章来源: C - unsigned int to unsigned char array conversion