5

当我在 Ada 中调用 Write 以序列化记录时,我希望能够预测生成的二进制文件中的内容。你知道我在哪里可以查到这个吗?

我有一些旧版 Ada 软件通过写入记录来生成二进制文件,我需要调试一个应该编写兼容二进制文件的 C++ 程序。所以,我想了解 Ada 在序列化记录时遵循的规则,以便我可以确保 C++ 代码将生成功能等效的记录。

4

4 回答 4

5

'Write 的序列化输出的格式与表示子句完全无关。

默认情况下,编译器将使用标准未定义的翻译方案,按照它们在记录声明中的写入顺序输出没有对齐填充的记录组件(因此您可能无法获得编译器之间的互操作性)。GNAT(GCC Ada 编译器)以整数字节输出每个组件。

如果您想使用某种不同的格式流式传输类型的值,您可以覆盖 'Write for the type. 作为一个不寻常的示例,您可以流式传输到 XML。

于 2008-11-25T23:29:54.310 回答
4

基本上,编译器将对记录类型的组件重新排序,除非您对记录类型使用 pragma PACK 或 pragma PRESERVE_LAYOUT 命令。此外,编译器将填充对象以保持记录组件的对齐。组件如下:

整数:8、16 或 32 位二进制补码有符号数

浮点数:32 位 IEEE 格式

Long_Float:64 位 IEEE 格式

定点:8、16 或 32 位;但是,指定的范围和增量可能会影响 16 或 32

枚举:整数,通常第一个元素用0表示

布尔值:枚举对象,8 位长,LSB 存储值:0 = false,1 = true

字符:枚举对象,8 位长,无符号 0 到 127

访问类型:32位,32位值为0代表NULL

数组:以行优先顺序连续存储,大小取决于基本类型。数组被填充以确保所有元素都对其类型具有正确的对齐方式。

于 2008-09-17T16:20:11.980 回答
3

正如其他人所提到的,如果没有额外的指令,编译器将自行决定记录布局。最好的方法是更改​​原始代码以使用特定布局编写记录。特别是,记录表示子句允许 Ada 程序员准确地指定记录的物理布局。实际上,您应该检查原始代码是否具有相关类型的其中之一。如果是这样,那么这将准确回答您的问题。

于 2008-09-17T22:19:53.410 回答
2

Ada95 语言参考手册说(第13.13.2 节):

“对于基本类型,流元素的表示是实现定义的。对于复合类型,每个组件的写入或读取属性以规范顺序调用。组件的规范顺序是数组的最后一个维度变化最快,并且记录的位置汇总订单。”

于 2008-09-17T16:06:24.060 回答