2015-10-13 79 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;