Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/backbone.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Serialization 了解Ada如何序列化记录_Serialization_Record_Binaryfiles_Ada - Fatal编程技术网

Serialization 了解Ada如何序列化记录

Serialization 了解Ada如何序列化记录,serialization,record,binaryfiles,ada,Serialization,Record,Binaryfiles,Ada,当我调用Write in Ada序列化记录时,我希望能够预测结果二进制文件中的内容。你知道我在哪里可以查到这个吗 我有一些遗留艾达软件,它通过编写一个记录来生成二进制文件,并且我需要调试一个C++程序,它应该编写兼容的二进制文件。因此,我想了解艾达在序列化记录时遵循的规则,这样我就可以确保C++代码将产生一个功能等同的记录。 < P>(第133.2节): “对于基本类型,流元素的表示是由实现定义的。对于复合类型,每个组件的写入或读取属性都是按规范顺序调用的。组件的规范顺序是数组的最后维度变化最快

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

我有一些遗留艾达软件,它通过编写一个记录来生成二进制文件,并且我需要调试一个C++程序,它应该编写兼容的二进制文件。因此,我想了解艾达在序列化记录时遵循的规则,这样我就可以确保C++代码将产生一个功能等同的记录。

< P>(第133.2节):


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

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

整数:8、16或32位2补有符号数

浮点:32位IEEE格式

长浮点数:64位IEEE格式

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

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

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

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

访问类型:32位,32位值0表示空


数组:按行主顺序连续存储,大小取决于基类型。数组被填充,以确保所有元素的类型都正确对齐。

如其他人所述,没有额外的指令,编译器将自行决定记录布局。最好的方法是更改原始代码,使用特定的布局编写记录。特别是,允许Ada程序员精确地指定记录的物理布局。事实上,您应该检查原始代码中是否有这些类型中的一个。如果是这样,那么这将准确地回答您的问题。

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

默认情况下,编译器将使用标准未定义的转换方案(因此可能无法实现编译器之间的互操作性),以记录声明中写入记录组件的顺序输出不带对齐填充的记录组件。GNAT(GCC Ada编译器)以整数字节输出每个组件


如果要使用不同的格式对某个类型的值进行流式处理,可以重写该类型的“写入”。作为一个不寻常的例子,您可以将数据流转换为XML。

如果我没有弄错的话,这是关于Stackoverflow的第一个Ada问题!呜呼!谢谢你的推荐。我希望有人在这个问题上写得更广泛一些。Ada的人倾向于坚持标准。我们没有可参考的cannonical实现。因此,如果你问“Ada是如何做X的?”而有人回答“这是实现违抗的”,这或多或少就是事情的结束。