关于字节:C-unsigned int到unsigned char数组的转换

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。

非常感谢。


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

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

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?根据答案,有几种不同的方法可以执行此操作:

  • 截断:这是建议的内容。如果您只是试图将数据压缩到需要unsigned char的函数中,则只需强制转换uchar ch = (uchar)x(但是,请注意,如果int太大,会发生什么情况)。

  • 特定字节序:当目的地需要特定格式时,请使用此格式。通常,网络代码喜欢将所有内容转换为字符的大端字节数组:

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

    会做到的。

  • 机器字节序。在没有字节序要求的情况下使用此选项,并且数据将仅在一台计算机上出现。阵列的顺序将在不同的体系结构中改变。人们通常使用union来解决此问题:

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

    使用memcpy

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

    或使用非常危险的简单转换(这是不确定的行为,并在许多系统上崩溃):

    1
    char *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

(一旦您了解了所发生的情况,就可以在没有任何变量的情况下完成操作,而只需将其全部转换即可)


您只需要使用bitwise & operator提取那些字节。 OxFF是提取一个字节的十六进制掩码。请在此处查看各种位操作-http://www.catonmat.net/blog/low-level-bit-hacks-you-absolutely-must-know/

示例程序如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#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
"
, c[0]);
    printf("c[1] = %x
"
, c[1]);
    printf("i    = %x
"
, i);

    return 0;
}

输出:

1
2
3
4
5
6
$ gcc 1.c
$ ./a.out
c[0] = 22
c[1] = 11
i    = 1122
$