以这种方式投射是行不通的。
您可以进行“反序列化”操作。
虽然这可能比其他一些方法慢,但它可以让您更好地控制协议(例如struct 成员顺序不必遵循协议)并且,结构中可能存在填充,这将如果我们在结构的末尾添加(例如)uint32_t test3;,就会显示出来。
代码如下:
#include <stdio.h>
#include <stdint.h>
typedef struct {
uint32_t test1;
uint16_t test2;
} Mst;
uint8_t myArray[6] = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06 };
uint32_t
get32(uint8_t **base)
{
uint8_t *ptr;
uint32_t val = 0;
ptr = *base;
for (int len = sizeof(uint32_t); len > 0; --len) {
val <<= 8;
val |= *ptr++;
}
*base = ptr;
return val;
}
uint16_t
get16(uint8_t **base)
{
uint8_t *ptr;
uint16_t val = 0;
ptr = *base;
for (int len = sizeof(uint16_t); len > 0; --len) {
val <<= 8;
val |= *ptr++;
}
*base = ptr;
return val;
}
int
main(void)
{
Mst myS;
uint8_t *arr = myArray;
myS.test1 = get32(&arr);
myS.test2 = get16(&arr);
printf("test1=%8.8X test2=%4.4X\n",myS.test1,myS.test2);
return 0;
}
更新:
是的,伙计们,他们会工作,但我想尽可能少地使用处理器。这是相当手动地将字节放入正确的顺序。同样,过程Mst * struct_p = (Mst*)myArray 工作安全,因为在定义struct 时我使用__attribute__((packed)),只是忘了写这个
我打算提及/建议packed 作为一种可能性。
在任何一种情况下,您都可以使用 [在 GNU 下]:byteswap.h 来获取 bswap_*。 Endian 交换非常普遍,因此这些为给定的拱 [高度] 优化。他们甚至可以调用编译器内部函数(例如__builtin_bswap32),这些函数利用arch 具有的任何特殊指令(例如x86 具有bswap 指令,arm 具有rev16)。
所以,你可以做 [i.e.将for 循环替换为](例如)bswap_*:
#include <stdio.h>
#include <stdint.h>
#include <byteswap.h>
typedef struct {
uint32_t test1;
uint16_t test2;
uint32_t test3;
} __attribute__((__packed__)) Mst;
uint8_t myArray[] = {
0x01, 0x02, 0x03, 0x04,
0x05, 0x06,
0x07, 0x08, 0x09, 0x0A
};
void
getall(Mst *myS)
{
myS->test1 = bswap_32(myS->test1);
myS->test2 = bswap_16(myS->test2);
myS->test3 = bswap_32(myS->test3);
}
int
main(void)
{
Mst *myS = (Mst *) myArray;
getall(myS);
printf("test1=%8.8X test2=%4.4X test3=%8.8X\n",
myS->test1,myS->test2,myS->test3);
return 0;
}