C - unsigned int to unsigned char array conversion

Jak*_*ake 16 c byte type-conversion unsigned-char unsigned-integer

我有一个无符号的int数(2字节),我想将其转换为unsigned char类型.从我的搜索中,我发现大多数人建议您执行以下操作:

 unsigned int x;
 ...
 unsigned char ch = (unsigned char)x;
Run Code Online (Sandbox Code Playgroud)

是正确的方法吗?我问,因为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] ??
 }
Run Code Online (Sandbox Code Playgroud)

另外,我们如何将unsigned char [2]转换回unsigned int.

非常感谢.

jpa*_*cek 20

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

memcpy(ch, (char*)&num, 2); /* although sizeof(int) would be better */
Run Code Online (Sandbox Code Playgroud)

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

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


cni*_*tar 17

怎么样:

ch[0] = num & 0xFF;
ch[1] = (num >> 8) & 0xFF;
Run Code Online (Sandbox Code Playgroud)

逆向操作留作练习.


abe*_*nky 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]);
Run Code Online (Sandbox Code Playgroud)


Dav*_*ave 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;
    
    Run Code Online (Sandbox Code Playgroud)

    会那样做.

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

    union {int x; char ch[sizeof (int)];} u;
    u.x = 0xf00
    //use u.ch 
    
    Run Code Online (Sandbox Code Playgroud)

    memcpy:

    uchar ch[sizeof(int)];
    memcpy(&ch, &x, sizeof x);
    
    Run Code Online (Sandbox Code Playgroud)

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

    char *ch = (unsigned char *)&x;
    
    Run Code Online (Sandbox Code Playgroud)