代码之家  ›  专栏  ›  技术社区  ›  Aviv Cohn

将uint16转换为字节,反之亦然-独立于系统端

  •  0
  • Aviv Cohn  · 技术社区  · 6 年前

    通过搜索,我发现可以执行以下操作,以便从 uint16_t ,然后将它们重新组合为原始编号:

    uint16_t x = 700;
    
    // extract the bytes
    uint8_t byte1 = (x >> 8) & 0xFF;
    uint8_t byte2 = x & 0xFF;
    
    // reassemble
    uint16_t y = (byte1 << 8) + byte2;
    

    但据我所知,这只适用于小端系统,而不适用于大端系统。

    有没有一种方法可以独立于系统的终结性来实现同样的事情?

    0 回复  |  直到 6 年前
        1
  •  1
  •   Nikos C.    6 年前

    您的代码不依赖于endian。当使用掩码查看变量位时,它们将始终显示为大端。高阶字节将出现在低阶字节的左边。即使在小恩迪安机器上,它们被交换,我们也不知道。

    然而,既然这样说了,您可以只复制字节而不实际查看它们。没有掩码,没有移位,只需复制字节:

    // extract the bytes
    uint8_t bytes[sizeof(x)];
    memcpy(bytes, &x, sizeof(x));
    
    // reassemble
    uint16_t y;
    memcpy(&y, bytes, sizeof(y));
    
        2
  •  0
  •   Parth    6 年前

    endianness指示数字存储在内存中的方式。 但是,当数字从内存加载到寄存器时,它是独立于端的。对输入号码的所有操作都是通过寄存器进行的,结果按顺序存储在存储器中。

    Eg. 
    Number = 0xAABB
    
                     Memory Address        Value
    Little Endian    0x3000                0xBB
                     0x3001                0xAA
    
    Big Endian       0x3000                0xAA
                     0x3001                0xBB
    

    但是,当加载到32位寄存器中时,数字仍然是0xaabb,因此无论endianness如何,uint8_t byte1和uint8_t byte2都将具有相同的值。