假设我有一个数组:
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最快的方法是什么?
答案 0 :(得分:1)
在小字节序机器上,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 :(得分:-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