由.NET System.IO.BinaryWriter编写的原始字节是否可供其他平台读取
本文关键字:是否 字节 其他 读取 平台 原始 System NET IO BinaryWriter | 更新日期: 2023-09-27 18:22:26
背景
我正在用System.IO.BinaryWriter
手动将一个大数据块写入一个二进制文件。我之所以选择这一点,是因为与其他各种序列化方式相比,性能有所提高;反序列化(我当前正在使用System.IO.BinaryReader
进行反序列化)。
问题
我可能需要在其他编程语言中使用序列化格式,如Java
和/或Rust
。他们是否能够理解System.IO.BinaryWriter
编写的原始二进制文件,并以类似于.NET的System.IO.BinaryReader的方式读取它?
(我假设新的平台(Java/Rust)将隐含地知道原始二进制文件的编写顺序。)
侧面信息
我知道,在这种情况下,协议缓冲区是一个性能和语言无关的框架,用于序列化/反序列化,但:(1) 我使用F#,它与受歧视的工会作斗争(2) 编写自己的自定义序列化程序并没有花太多精力,因为我的类型并不太复杂
这取决于使用BinaryWriter
编写的类型。
byte
、sbyte
、byte[]
:没问题(U)IntXX
:序的问题。.NETBinaryWriter
以little-endian格式转储这些类型float
和double
:如果两个系统使用相同的IEEE 754标准,并且两个系统都使用相同的字节序,那么这是没有问题的decimal
:这是.NET特定的类型,类似于Currency
,但使用不同的格式。小心使用- CCD_ 16和CCD_ 17:使用CCD_ 19的当前CCD_。两边使用相同的编码,一切都会好起来
string
:字符串的长度以所谓的7位编码的int格式编码(1个字节,最多127个字符等),和使用当前编码。为了使其兼容,也许您应该使用手动转储的长度信息来转储字符数组
可以。
bool --> 0 | 1
sbyte --> x
byte[] --> xxxxxx
char[] --> encoding.getbytes(char[])
byte --> x
char -->
decimal --> decimal.GetBytes(), 16 bytes, should see the System.Decimal class code
double --> 8 bytes, should see the System.Double class code
short --> 2 bytes, <lsb><msb>
int --> 4 byets, <lsb>xx<msb>
long --> 8 bytes, <lsb>xxxxxx<msb>
float --> 4 bytes, should see the System.Single class code
string --> 7 bit encoded length (variable size) + encoding.GetBytes(), see 7 bit encoding method below
ushort --> same as short
uint --> same as int
ulong --> same as long
对于数字类型,数据以小恩迪亚格式写入
protected void Write7BitEncodedInt(int value)
{
uint num = (uint) value;
while (num >= 0x80)
{
this.Write((byte) (num | 0x80));
num = num >> 7;
}
this.Write((byte) num);
}