我应用程序移植到一个手臂的平台,在C、应用程序也运行在一个x86处理,并须向后兼容。

我现在有一些问题与变量对准。我已经阅读了海湾合作委员会手册 __attribute__((aligned(4),packed)) 我理解你在说什么作为开始的结构结盟的4个字节的边界内保持不变,因为打包的发言。

本来我有这个但偶尔也得到安置对齐的4个字节的边界。

typedef struct  
{  
 unsigned int code;  
 unsigned int length;  
 unsigned int seq;  
 unsigned int request;  
 unsigned char nonce[16];  
 unsigned short  crc;  
} __attribute__((packed)) CHALLENGE;

所以我改变它。

typedef struct  
{  
 unsigned int code;  
 unsigned int length;  
 unsigned int seq;  
 unsigned int request;  
 unsigned char nonce[16];  
 unsigned short  crc;  
} __attribute__((aligned(4),packed)) CHALLENGE;

该了解我刚才所说似乎是不正确的,因为两者的结构现在与4个字节的边界,并与内部数据现在是对准一个四字节的边界,而是因为endianess,大小的结构有所增加的大小从42至44字节。该尺寸是至关重要的,因为我们有其他的应用,取决于结构正在42个字节。

可能一些描述我如何执行操作的,我需要。任何帮助是非常赞赏。

有帮助吗?

解决方案

如果你是这取决于 sizeof(yourstruct) 在42个字节,你被咬了一个世界的非便携式的假设。你有没有说这是什么,但似乎可能是字节序的结构内容的事项,所以你也可能有一个配x86有太多。

在这种情况下,我认为唯一的确保停火的方式应付的是使用 unsigned char[42] 在该部其它事项。开始编写一个精确的规范究竟是什么领域都是在这42-byte块,并什么endian,然后使用该定义来编写一些代码翻译之间的,以及一个结构可以进行互动。代码很可能会是一次电子监管码(又名调度),或者一群吸气,并制定者。

其他提示

这是一个原因为什么阅读整个结构,而不是员失败,并且应加以避免。

在这种情况下,包装加调整,在4意味着将有两个字节的填充。发生这种情况的原因是大小必须兼容,用于储存的类型在一系列的所有物品仍然排在4.

我想你有喜欢的东西:

read(fd, &obj, sizeof obj)

因为你不想读这些2填字节,这属于不同的数据,必须指定明确的尺寸:

read(fd, &obj, 42)

你可以保留维护:

typedef struct {
  //...
  enum { read_size = 42 };
} __attribute__((aligned(4),packed)) CHALLENGE;

// ...

read(fd, &obj, obj.read_size)

或者,如果你不能使用某些功能的C++在C:

typedef struct {
  //...
} __attribute__((aligned(4),packed)) CHALLENGE;
enum { CHALLENGE_read_size = 42 };

// ...

read(fd, &obj, CHALLENGE_read_size)

在下一个重构的机会,我要强烈建议你开始阅读的每个成员单独地,它可以很容易被封在一个功能。

什么是你真正的目标?

如果这是处理数据的文件中或在电线在一个特定的格式是什么,你应该做的是写入了一些编组/化程序移动之间的数据编译器结构,这表示你想怎么处理的数据的内部程序和char阵列处理数据如何看起来在线/文件。

然后所有需要处理与仔细和可能有的平台特定代码的封送程序。你可以写一些不错的-n-讨厌的单元的测试,以确保封送数据获取和结构妥善无论什么样的平台,你可能必须向港口当今和未来。

我一直在移动的结构来来回回从Linux,Windows,Mac、C、斯威夫特,会,等等。

问题不在于它无法完成,问题是,你不能偷懒,必须了解你的工具。

我不明白为什么你不能使用:

typedef struct  
{  
 unsigned int code;  
 unsigned int length;  
 unsigned int seq;  
 unsigned int request;  
 unsigned char nonce[16];  
 unsigned short  crc;  
} __attribute__((packed)) CHALLENGE;

你的 可以 使用它,这并不需要任何特别的或聪明的代码。我写了很多的代码进行通信的手臂。结构是什么让事情的工作。 __attribute__ ((packed)) 是我的朋友。

赔率是在一个"世界的伤害"是零如果你了解什么是与两个。

最后,我不能为生活做出来你如何得到42,或44人。Int是我们4 8个字节(这取决于compiler).这使数在16+16+2=34或32+16+2=50--假设它是真正的包装。

正如我说,知道你的工具是部分的问题。

我猜想这个问题是,42个不可分4,和使他们摆脱对如果你把这些结构的背对背的(例如分配存储器数,确定尺寸 sizeof).具有的尺寸为44部队的准在这些情况下,如你要求。但是,如果内部失调的每个结构部件仍然是相同的,你可以治疗的44字节的结构,因为尽管它是42字节(只要你照顾到对准任何以下的数据在正确的边界)。

一个特技的尝试可能把 这些结构内的一个单一的联盟类型,并且仅使用42-字版本内的每一个这样的联盟。

因为我使用linux,我们发现,通过 echo 3 > /proc/cpu/alignment 它将发出我的警告和修订的准的问题。这是一个工作周围,但它是非常有用定位那里的结构是不能失调。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top