2014-04-09 93 views
0
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

還有,你試過這麼遠嗎? –

+0

試圖將myMsg轉換爲MY_HDR並將(myMsg + n - myMsg + 1)轉換爲MY_DATA。它會起作用嗎?我不確定。 – user3440736

回答

1

如果myMsg的第一個字節是你想要的數據,那麼你不需要「提取」它。只是強制轉換myMsgMY_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); 
+0

謝謝你。 – user3440736

+0

如何將myMsg的字節2到n轉換爲MY_DATA的類型?任何幫助? – user3440736

+0

我可以將int8_t定義爲** typedef signed int int8_t **? – user3440736

相關問題