由.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) 编写自己的自定义序列化程序并没有花太多精力,因为我的类型并不太复杂

由.NET System.IO.BinaryWriter编写的原始字节是否可供其他平台读取

这取决于使用BinaryWriter编写的类型。

  • bytesbytebyte[]:没问题
  • (U)IntXX:序的问题。.NET BinaryWriter以little-endian格式转储这些类型
  • floatdouble:如果两个系统使用相同的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);
}