将uint16转换为字节数组

问题描述 投票:0回答:2

假设我有一个数组:

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最快的方法是什么?

c arrays hex
2个回答
1
投票

Well 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;
}

-1
投票

您可以声明一个uint8_t指针,然后将数据作为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

© www.soinside.com 2019 - 2024. All rights reserved.