如何从十六进制转储中提取字节?

时间:2014-04-09 07:06:42

标签: c bytearray

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

指向十六进制转储。

1 个答案:

答案 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);