当我在Ada中调用Write来序列化记录时,我希望能够预测结果二进制文件中的内容。你知道我在哪里可以看到这个吗?
我有一些遗留的Ada软件通过写一条记录来生成二进制文件,我需要调试一个应该编写兼容二进制文件的C ++程序。所以,我想了解Ada在序列化记录时遵循的规则,这样我就可以确保C ++代码能够产生功能相同的记录。
答案 0 :(得分:4)
'Write has 绝对没有的序列化输出的格式与表示子句有关。
默认情况下,编译器将使用标准未定义的转换方案,按照它们在记录声明中写入的顺序输出没有对齐填充的记录组件(因此您可能无法获得编译器之间的互操作性)。 GNAT(GCC Ada编译器)以整数个字节输出每个组件。
如果要使用某种不同的格式来传输类型的值,可以覆盖“为类型写入”。作为一个不寻常的例子,您可以流式传输到XML。
答案 1 :(得分:3)
基本上,编译器将重新排序记录类型的组件,除非您使用pragma PACK或pragma PRESERVE_LAYOUT命令与记录类型。此外,编译器将填充对象以保持记录组件的对齐。组件如下:
整数:8,16或32位二进制补码有符号数
Float: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
数组:以行主要顺序连续存储,大小取决于基本类型。数组被填充以确保所有元素都具有适合其类型的对齐。
答案 2 :(得分:2)
正如其他人所提到的,如果没有额外的指令,编译器将自己做出有关记录布局的决定。最好的方法是更改原始代码以使用特定布局编写记录。特别是,record representation clause允许Ada程序员准确指定记录的物理布局。实际上,您应该检查原始代码是否具有相关类型的其中一个。如果是这样,那么这将准确地回答你的问题。
答案 3 :(得分:1)
Ada95 Language Reference Manual说(第13.13.2节):
“对于基本类型,流元素的表示是实现定义的。对于复合类型,每个组件的Write或Read属性以规范顺序调用。组件的规范顺序是最后一个维度变化最快的数组和记录的位置聚合顺序。“