19

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

 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

非常感谢。

4

6 回答 6

23

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

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

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

同样的方法,只是颠倒 memcpy 的参数。

于 2012-04-25T16:29:38.317 回答
15

怎么样:

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

逆运算留作练习。

于 2012-04-25T16:28:52.433 回答
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]);
于 2012-04-25T16:31:21.213 回答
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;
    

    会这样做。

  • 机器字节序。当没有字节序要求时使用它,并且数据只会出现在一台机器上。阵列的顺序将在不同的架构中发生变化。人们通常用unions 来处理这个问题:

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

    memcpy

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

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

    char *ch = (unsigned char *)&x;
    
于 2012-04-25T16:54:42.823 回答
4

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

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

(一旦你明白了发生了什么,它可以在没有任何变量的情况下完成,所有只是铸造)

于 2012-04-25T16:33:43.803 回答
3

您只需要使用bitwise & operator. OxFF是提取一个字节的十六进制掩码。请在这里查看各种位操作 - 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 
$
于 2012-04-25T16:37:02.967 回答