C – unsigned int to unsigned char数组转换

我有一个无符号的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

非常感谢。

在这种情况下你可以使用memcpy

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

另外,如何将unsigned char [2]转换回unsigned int。

同样的方法,只需反转memcpy的参数即可。

怎么样:

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

相反的操作留作练习。

使用工会怎么样?

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

这实际上取决于你的目标:为什么要将其转换为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; 

    会那样做。

  • 机器端 。 在没有字节顺序要求时使用此选项,数据仅在一台计算机上发生。 arrays的顺序将在不同的架构中发生变化。 人们通常用union来处理这个问题:

     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; 

当然,大到足以包含更大值的字符数组必须与此值本身一样大。 所以你可以简单地假装这个更大的值已经是一个字符数组:

 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 

(一旦你理解了正在发生的事情,它可以在没有任何变量的情况下完成,所有这些都只是投射)

您只需要使用bitwise & operator提取这些字节。 OxFF是一个hex掩码,用于提取一个字节。 请看这里的各种位操作 – http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/

示例程序如下:

 #include  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 $