[英]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
編寫的類型。
byte
, sbyte
和byte[]
:沒問題。 (U)IntXX
:字節序的問題。 .NET BinaryWriter
以小字節序格式轉儲這些類型。 float
和double
:如果兩個系統使用相同的IEEE 754標准,並且兩個系統使用相同的字節序,則沒有問題。 decimal
:這是.NET特定的類型,類似於Currency
但使用不同的格式。 小心使用。 char
和char[]
:使用BinaryWriter
的當前Encoding
。 雙方使用相同的編碼,一切正常。 string
: 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
對於數字類型,數據以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.