c-将uint16转换为字节数组



假设我有一个数组:

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语言做这件事最快的方法是什么?

在little-endian机器上,好的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;
}

您可以声明一个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]);
}

在一台小型endian机器上,您可以得到以下输出:

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

在big-endian机器上,所有值对都被翻转:

1A、20、1A、35、1A、EC、1AB8、1A、5D、1A和F3

最新更新