2015-10-13 96 views
0

我有以下字節數組,我正在鑄造到下面的結構: **我知道它不是在這裏適當的格式"0x80",等,但在我的代碼它是。字節數組結構 - 如何訪問結構成員

unsigned char ReadBuffer[512] = { 80 00 00 00 50 00 00 00 01 00 40 00 00 00 01 00 00 00 00 00 00 00 00 00 FF F2 00 00 00 00 00 00 40 00 00 00 00 00 00 00 00 00 30 0F 00 00 00 00 00 00 30 0F 00 00 00 00 00 00 30 0F 00 00 00 00 33 20 C8 00 00 00 0C 42 E0 2A 0F 9F B9 00 00 FF} 

typedef struct MFT_ATTRIBUTE { 
    DWORD dwType; 
    DWORD dwFullLength; 
    BYTE uchNonResFlag; 
    BYTE uchNameLength; 
    WORD wNameOffset; 
    WORD wFlags; 
    WORD wID; 
    LONG n64StartVCN; 
    LONG n64EndVCN; 
    WORD wDatarunOffset; 
    WORD wCompressionSize; 
    BYTE uchPadding[4]; 
    LONGLONG n64AllocSize; 
    LONGLONG n64RealSize; 
    LONGLONG n64StreamSize; 
} MFT_ATTRIBUTE, *P_MFT_ATTRIBUTE; 

MFT_ATTRIBUTE* mft_attribute = (MFT_ATTRIBUTE*)ReadBuffer[0]; 

當我嘗試打印的成員,由於某種原因,我得到了某種增量值:

printf("%x ",&mft_attribute->dwType); 
printf("%x ",&mft_attribute->dwFullLength); 
printf("%x ",&mft_attribute->uchNonResFlag); 
printf("%x ",&mft_attribute->uchNameLength); 

Output: 
0x80 0x84 0x88 0x89 

有人可以幫我澄清這一點?

+0

你爲什麼不寫'無符號的字符ReadBuffer [512] = {0x80的,爲0x00,0x00時,'等等?你在代碼片段中顯示的內容不會被編譯。 – Wolf

回答

1

您正在將數組的第一個元素轉換爲指向您的結構體的指針。

MFT_ATTRIBUTE* mft_attribute = (MFT_ATTRIBUTE*)ReadBuffer[0]; 

你想一個指針轉換爲第一要素:

MFT_ATTRIBUTE* mft_attribute = (MFT_ATTRIBUTE*) (ReadBuffer + 0); 

另外,作爲@Wolf指出,今年將打印指針不值指出:

printf("%x ",&mft_attribute->dwType); 

你需要,而不是

printf("%x ", mft_attribute->dwType); 
+0

正確,謝謝它將被標記爲答案 – msbir

+1

一個錯誤可能很容易隱藏在另一個錯誤之後;-) – Wolf

3

您正在打印地址,而不是值。這就是爲什麼輸出增加這種方式:

  • 0x80的 - 的基地址,與第一構件dwType
  • 的0x84 - 第二構件,dwFullLength,的sizeof(dwType)除了開始
  • 均爲0x88 - 第三構件,uchNonResFlag,再次4,偏移的sizeof(dwFullLength)
  • 0x89上 - 第四構件,所述偏移量是1,這是的sizeof(uchNonResFlag)

卸下&之前mft_attribute在您的輸出代碼中:

printf("%x ", mft_attribute->dwType); 
printf("%x ", mft_attribute->dwFullLength); 
printf("%x ", mft_attribute->uchNonResFlag); 
printf("%x ", mft_attribute->uchNameLength); 
+0

謝謝,這是答案的另一半。 – msbir

+0

好。但是,這個'{0 1 2}'語法在您的計算機上如何編譯? – Wolf

+0

它不,但我的數據是動態創建的,所以我不想花費精力添加「」 – msbir

0

Change你的施法以下幾點:

MFT_ATTRIBUTE* mft_attribute = (MFT_ATTRIBUTE*)&ReadBuffer[0]; 

MFT_ATTRIBUTE* mft_attribute = (MFT_ATTRIBUTE*)ReadBuffer;