.NET十进制跨平台标准

如果我使用二进制编写器将C#十进制数组保存到二进制blob,我是否能够在Java或Python或R中无缝读取此blob? 这些语言是否具有相应的数据类型,或者是否存在.NET十进制所遵循的跨平台标准?

我在存储之前将所有数值数据转换为小数,因为当一个小数组数组被扩散然后压缩时,生成的blob大小比任何算法压缩的浮点blob小得多(我的测试显示c.2x)更小的空间)。 并且小数在变差时不会失去精确度。 但我不确定我是否可以从.NET以外的任何其他语言中读取这些blob。

我正在阅读维基页面,但我自己无法回答这个简单的问题。

更新:

目前我对decimal[]数组进行了不安全的引用并将其转换为(byte* )指针,但这相当于二进制writer。 问题是关于跨平台十进制互操作,而不是序列化。 在第一个答案中查看我的评论。

System.Decimal类型的文档没有说明它使用的内部表示forms(与使用IEEE-754的System.SingleSystem.Double不同)。 鉴于此,您不能假设任何十进制数的原始二进制状态表示在.NET Framework版本之间或甚至在运行相同版本的物理机之间是一致的。

我假设您正在使用BinaryWriter.Write(Decimal value)方法。 此方法的文档不会对正在使用的实际格式做出任何声明。

查看.NET参考源代码 ,我们看到BinaryWriter.Write(Decimal)使用内部方法: Decimal.GetBytes(Byte[] buffer) ,它使用未来可能会更改的未记录格式,也可能因机器而异。

然而! Decimal类确实提供了一个公共方法GetBits ,它确实保证了它返回的数据格式,所以我建议你改用它:

 // Writing Int32[] bits = myDecimal.GetBits(); binaryWriter.Write( (byte)bits.Length ); foreach(Int32 component in bits) binaryWriter.Write( component ); // Reading byte count = binaryReader.ReadByte(); Int32[] bits = new Int32[ count ]; for(Int32 i = 0; i < bits.Count; i++ ) { bits[i] = binaryReader.ReadInt32(); } Decimal value = new Decimal( bits ); 

此方法使用17个字节以记录的方式存储Decimal实例,并保证无论Decimal类型的内部设计如何都可以工作。 16个字节存储实际值,1个字节存储表示小数所需的32位整数(如果数字从4变化)。