簡體   English   中英

.NET System.IO.BinaryWriter寫入的原始字節是否可以被其他平台讀取?

[英]Are the raw bytes written by .NET System.IO.BinaryWriter readable by other platforms?

背景

我正在使用System.IO.BinaryWriter手動將大數據塊寫入二進制文件。 我之所以選擇它,是因為與各種其他序列化和反序列化方法相比,性能有所改善(我目前正在使用System.IO.BinaryReader反序列化)。

我可能需要在Java和/或Rust等其他編程語言中使用序列化格式。 他們是否能夠理解System.IO.BinaryWriter編寫的原始二進制文件並以類似於.NETs'System.IO.BinaryReader'的方式讀取它?

(我假設新平台(Java / Rust)將對原始二進制文件的寫入特定順序具有隱式知識。)

邊信息

我知道協議緩沖區在這種情況下本來是用於序列化/反序列化的高性能和語言不可知的框架,但是:(1)我正在使用F#,並且它與被區分的聯合不兼容(2)確實沒有那么多工作寫我自己的自定義序列化程序,因為我的類型不太復雜

這取決於您使用BinaryWriter編寫的類型。

  • bytesbytebyte[] :沒問題。
  • (U)IntXX :字節序的問題。 .NET BinaryWriter以小字節序格式轉儲這些類型。
  • floatdouble :如果兩個系統使用相同的IEEE 754標准,並且兩個系統使用相同的字節序,則沒有問題。
  • decimal :這是.NET特定的類型,類似於Currency但使用不同的格式。 小心使用。
  • charchar[] :使用BinaryWriter的當前Encoding 雙方使用相同的編碼,一切正常。
  • stringstring的長度以所謂的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

對於數字類型,數據以Little Endian格式寫入

protected void Write7BitEncodedInt(int value)
{
    uint num = (uint) value;
    while (num >= 0x80)
    {
        this.Write((byte) (num | 0x80));
        num = num >> 7;
    }
    this.Write((byte) num);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM