繁体   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