typedef struct MY_HDR
{
TU8 VALUE:6;
TU8 EXT1:1;
TU8 EXT2:1;
}MyHdr;
typedef struct MY_DATA
{
TU32 BIT1:1;
TU32 BIT2:1;
TU32 VAL:3;
TU32 VAL1:4;
TU32 VAL3:10;
TU32 VAL4:1;
TU32 VAL5:11;
TU32 VAL6:1;
TU16 VAL7;
}MyData;
我有一个十六进制转储,它的类型为MY_HDR + MY_DATA,其中MY_HDR是十六进制转储的第一个字节。现在我需要分析MY_HDR的内容,因为我只需要提取第一个字节并将其类型转换为MY_HDR的类型。然后我需要分析MY_DATA的内容,因为我只需要提取下一个字节并输入类型为MY_DATA。任何人都可以帮我知道(语法)如何从十六进制转储中只提取一个字节和字节2到n?我对位操作很满意,但不确定如何获取字节。我也有一个指针:
VOID *myMsg
指向十六进制转储。
答案 0 :(得分:1)
如果myMsg
的第一个字节是您想要的数据,那么您不需要“提取”它。只需将myMsg
作为MY_HDR
指针进行类型转换:
MyHdr *hdrPtr = (MyHdr *) myMsg;
printf("My header value is %d\n", hdrPtr->VALUE);
以下数据有点困难,因为它是从头开始的偏移量,并且您不能在void*
上使用指针算法。您必须使用双类型转换才能工作,然后将类型转换为一个类型,在该类型上添加一个只会偏移一个字节:
MyData *dataPtr = (MyData *) ((int8_t *) myMsg + 1);
printf("My data bit 1 is %d\n", dataPtr->BIT1);
(请参阅this reference了解int8_t
类型的位置。)
请记住,您也可以使用带指针的数组索引:
for (size_t i = 0; i < N; ++i)
printf("dataPtr[%lu].BIT1 = %d\n", i, dataPtr[i].BIT1);