【问题标题】:convert unsigned integer to byte array in C在C中将无符号整数转换为字节数组
【发布时间】:2012-02-17 20:56:19
【问题描述】:

您能解释一下如何将最后 3 个字节的数据从无符号整数转换为字符数组吗?

例子:

unsigned int unint = some value;
unsigned char array[3];

【问题讨论】:

  • 你说的最后三个字节是什么意思?
  • 我猜他的意思是最不重要的 3 个字节,但我可能错了。

标签: c arrays int


【解决方案1】:

如果最后三个,您的意思是 lsb+1lsb+2msb(换句话说,除了 lsb),那么你就可以用这个了。

unsigned int unint = some value;
unsigned char * array = ( (unsigned char*)&some_value ) + 1;

【讨论】:

    【解决方案2】:

    根据您的需要,您可能更喜欢联合:

    typedef union {
        unsigned int  unint;
        unsigned char array[3];  
    } byteAndInt;
    

    或位移操作:

    for(int i=0; i<3; i++)
        array[i] = (unint>>8*i) & 0xFF;
    

    前者不是字节序安全的。

    【讨论】:

    • 不先写给一个工会的成员,然后再读另一个而不先写的UB吗?
    • @Seth UB 按照标准,但由我遇到的所有编译器定义良好。
    • 联合指定同一个内存区域可以有多种解释方式。这就是编写一个字段并读取另一个字段的目的。当然,在大端机器和小端机器上执行相同的代码会产生不同的结果。但这是一个可移植性问题,而不是 UB。
    • @Seth 不再。在 C11 中,在 n1570 中,6.5.2.3 中的 fn 95 表示“值的对象表示的适当部分被重新解释为 6.2.6 中描述的新类型中的对象表示(这个过程有时称为 ''type双关语'')。这可能是一个陷阱表示“。
    • @DanielFischer 哦,我不知道C11,我以为最后一个是C99。谢谢。
    【解决方案3】:

    你可以使用它的按位右移运算符:

    array[0] = unint;
    array[1] = unint >> 8;
    array[2] = unint >> 16;
    

    uint 的最低有效字节存储在数组的第一个元素中。

    【讨论】:

    • @Nick 在长度为 3 的字符数组中?
    【解决方案4】:

    如果你必须将它转换为一个数组会比较困难,但是如果你只是想访问单个字节,那么你可以这样做

    char* bytes = (char*)&unint;
    

    如果您确实想要创建一个数组(因此复制最后 3 个字节,而不是保留它们),您可以这样做

    unsigned char bytes[3]; // or char, but unsigned char is better
    
    bytes[0] = unint >> 16 & 0xFF;
    bytes[1] = unint >> 8  & 0xFF;
    bytes[2] = unint       & 0xFF;
    

    【讨论】:

      猜你喜欢
      • 2014-03-28
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      • 2012-05-10
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 2017-04-02
      相关资源
      最近更新 更多