簡體   English   中英

如果結構未正確對齊,如何訪問結構的成員?

[英]How can I access members of a struct when it's not aligned properly?

恐怕我不太擅長使用低級C語言,我更習慣於在Obj-c中使用對象,因此,如果這是一個明顯的問題,或者如果我完全誤解了一些東西,請原諒。 ..

我試圖用Cocoa / Obj-C編寫一個與外部硬件(現金提款機)進行通信的應用程序。我具有設備發送和接收的數據格式-並已成功從設備獲取了一些數據塊。設備。

例如:till使用以下格式的數據塊交換PLU(價格數據):(來自文檔)

名稱字節類型

Name             Bytes    Type

PLU code h        4      long   
PLU code L        4      long
desc              19     char
Group             3      char
Status            5      char 
PLU link code h   4      long 
PLU link code l   4      long
M&M Link          1      char
Min. Stock.       2      int
Price 1           4      long 
Price 2           4      long

Total 54 Bytes

因此,我具有以下形式的結構,其中可以保存數據源中的數據:

typedef struct MFPLUStructure { 
 UInt32   pluCodeH; 
 UInt32   pluCodeL; 
 unsigned char description[19]; 
 unsigned char group[3]; 
 unsigned char status[5]; 
 UInt32   linkCodeH; 
 UInt32   linkCodeL; 
 unsigned char mixMatchLink; 
 UInt16   minStock; 
 UInt32   price[2];  
} MFPLUStructure;  

我有一些直到(下面)的已知樣本數據,這些數據我已經手工檢查過並有效

00 00 00 00 4E 61 BC 00 54 65 73 74 20 50 4C 55 00 00 00 00 00 00 00 00 00 00 00 00 09 08 07 17 13 13 7C 14 04 00 00 00 00 09 03 00 00 05 BC 01 7B 00 00 00 00 00 00 00

  • 字節46到50是<7B 00 00 00> == 123,正如我所期望的那樣,因為直到耕作價格都設置為“ 123”。

  • 正如我期望的那樣,字節43是<05> == 5,因為“混合匹配鏈接”在耕種上設置為5。

  • 字節39到43是<09 03 00 00> == 777,因為我一直希望將'link code'設置為'777'。

  • 字節27、28、29是<09 08 07> ,這是我期望的三組(7、8和9)。

當我嘗試以編程方式從結構中獲取一些數據時,就會出現問題:早期成員可以正常工作,直到包括五個“狀態”字節為止。 但是,此后的成員不會正確顯示。 (請參見下面的調試器屏幕截圖。)

圖片1- http://i.stack.imgur.com/nOdER.png

我認為這樣做的原因是因為五個狀態字節將后面的成員推到不對齊的位置,即它們超出了機器字邊界。 這是正確的嗎?

圖片2-i.imgur.com/ZhbXU.png

我做這個假設對嗎?
如果是這樣,我如何正確地加入和退出成員?

謝謝你的幫助。

或者在一個時間訪問數據的一個字節,並將其組裝成更大的類型,或者memcpy成對准變量。 如果已知數據采用特定於主機字節順序的格式,則后者更好。如果數據遵循的外部規范可能與主機不匹配,則后者更好。

如果您確定主機和連接線的字節序一致,則還可以使用打包結構以單次讀取數據。 但是,這是特定於編譯器的,並且很可能會影響成員訪問的性能。

假設gcc ,您將使用以下聲明:

struct __attribute__ ((__packed__)) MFPLUStructure { ... };
typedef struct MFPLUStructure MFPLUStructure;

如果決定使用壓縮結構,則還應驗證其大小是否正確:

assert(sizeof (MFPLUStructure) == 54);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM