将 uint16 转换为字节数组

Convert uint16 to byte array

假设我有一个数组:

uint16 my_uint16_Array[6] = {0x1A20, 0x1A35, 0X1AEC, 0x1AB8, 0x1A5D, 0x1AF3}

我想将此数组转换为字节数组以便:

uint8 my_uint8_Array[12] = {0x1A, 0x20, 0x1A, 0x35, 0X1A, 0xEC, 0x1A, 0xB8, 0x1A, 0x5D, 0x1A, 0xF3}

用 c 语言最快的方法是什么?

您可以声明一个 uint8_t 指针,并且只是 "reinterpret" 数据作为 uint8_t 数组。但要注意字节顺序!顺序可能与您期望的不同:

uint8_t *bytePointer = (uint8_t*) my_uint16_Array;
for(uint8_t i=0; i< sizeof(my_uint16_Array); i++) {
    printf("%02X, ", bytePointer[i]);
}

在小端机器上你得到这个输出:

20, 1A, 35, 1A, EC, 1A, B8, 1A, 5D, 1A, F3, 1A

在大端机器上,翻转所有值对:

1A, 20, 1A 35, 1A, EC, 1AB8, 1A, 5D, 1A, F3

好吧 memcpy 不足以在小端机器上完成这项任务。在那种情况下我会这样做。虽然我不保证这是最快的方法。

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint16_t my_uint16_Array[6] = {0x1A20, 0x1A35, 0X1AEC, 0x1AB8, 0x1A5D, 0x1AF3};
    uint8_t my_uint8_Array[12];

    for (int i = 0; i < 6; i++)
    {
        my_uint8_Array[i << 1] = my_uint16_Array[i] >> 8;
        my_uint8_Array[(i << 1) + 1] = my_uint16_Array[i] & 0xFF;
    }

    for (int i = 0; i < 12; i++)
        printf("0x%x ", my_uint8_Array[i]);

    return 0;
}

输出

0x1a 0x20 0x1a 0x35 0x1a 0xec 0x1a 0xb8 0x1a 0x5d 0x1a 0xf3 

另一个版本似乎使用带有 gcc 6.2.1 和 -O3 标志的 MSP430 架构产生较少的汇编指令。这也更接近 x86 在使用上述代码优化后实际执行的操作。

#include <stdio.h>
#include <stdint.h>

int main()
{
    uint16_t my_uint16_Array[6] = {0x1A20, 0x1A35, 0X1AEC, 0x1AB8, 0x1A5D, 0x1AF3};
    uint8_t my_uint8_Array[12];

    uint8_t *highBytePtr = (uint8_t*) my_uint16_Array;
    uint8_t *lowBytePtr = (uint8_t*) my_uint16_Array;
    highBytePtr++;

    for (int i = 0; i < 12; i += 2, highBytePtr += 2, lowBytePtr += 2)
    {
        my_uint8_Array[i] = *highBytePtr;
        my_uint8_Array[i + 1] = *lowBytePtr;
    }

    for (int i = 0; i < 12; i++)
        printf("0x%x ", my_uint8_Array[i]);

    return 0;
}