簡體   English   中英

C#-使用兩個字節而不是一個字節的長度將字符串寫入流

[英]C# - Writing strings to a stream using two bytes for length, not one

我正在創建一個具有可擴展協議的易於使用的服務器-客戶端模型,其中服務器使用Java,客戶端可以是Java,C#,隨便什么。

我遇到了這個問題:Java數據流在寫字符串時用一個短的字符串指定了length ,然后是數據。

C#讓我指定所需的編碼, 但是它只讀取一個字節的length (實際上,它說“一次7位” ...這很奇怪。這可能是我的問題的一部分?)

這是我的設置:服務器一旦連接就向客戶端發送一個字符串。 這是一個短字符串,因此第一個字節為0,第二個字節為9; 該字符串為9個字節長。

//...
_socket.Connect(host, port);
var stream = new NetworkStream(_socket);
_in = new BinaryReader(stream, Encoding.UTF8);
Console.WriteLine(_in.ReadString()); //outputs nothing

當然,在讀取字符串之前先讀取一個字節會輸出預期的字符串。 但是,如何設置流讀取器以使用兩個字節而不是一個字節的長度讀取字符串? 我是否需要繼承BinaryReader並重寫ReadString()?

如果我沒有記錯的話,C#BinaryWriter / Reader行為使用第8位來表示計數的最后一個字節在哪里。 這允許最多127個計數適合單個字節,同時仍允許更大的實際計數值(即最大2 ^ 31-1); 在這方面有點像UTF8。

為了您自己的目的,請注意,您正在編寫整個協議(大概),因此您可以完全控制兩端。 您在C#和Java中描述的兩種行為都是由每種語言中的本質上是幫助器類實現的。 沒什么好說的,您必須使用它們,並且兩種語言都提供了一種將文本直接直接編碼為字節數組的方式,您可以隨意發送。

如果您確實想使用基於Java的協議,則可以使用BitConvertershortbyte[]之間進行轉換,以便可以顯式發送和接收這兩個字節。 例如:

_in = new BinaryReader(stream, Encoding.UTF8);
byte[] header = _in.ReadBytes(2);
short count = BitConverter.ToInt16(header, 0);
byte[] data = _in.ReadBytes(count);
string text = Encoding.UTF8.GetString(data);
Console.WriteLine(text); // outputs something

暫無
暫無

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

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