2013-10-31 55 views
3

我正在解析器上接收UDP信息,解析並存儲它。要做到這一點,我使用的是BinaryReader,因爲它主要是二進制信息。其中一些將會是字符串。 MSDN saysReadString()功能:BinaryReader ReadString指定長度?

從當前流中讀取一個字符串。該字符串的前綴長度爲 ,一次編碼爲7位整數。

我完全理解它,直到我試圖簡單地忽略,直到我開始測試爲止。我在創建自己的字節數組之前,將其放入MemoryStream並嘗試用BinaryReader讀取它。這是我第一個想到的會的工作:

byte[] data = new byte[] { 3, 0, 0, 0, (byte)'C', (byte)'a', (byte)'t', } 
BinaryReader reader = new BinaryReader(new MemoryStream(data)); 
String str = reader.ReadString(); 

知道的int爲4個字節(和玩弄足夠長的時間來找出BinaryReader,就是little endian),我通過它的3長度和相應的字母。但str最終持有\0\0\0。如果我刪除了3個零,只是有

byte[] data = new byte[] { 3, (byte)'C', (byte)'a', (byte)'t', } 

然後,它讀取和存儲Cat正常。對我來說,這與文檔的衝突說長度應該是一個整數。現在我開始認爲它們只是一個沒有小數位的數字,而不是數據類型int。這是否意味着BinaryReader永遠不會讀取大於127個字符的字符串(因爲這將是01111111對應於文檔的7位部分)?

我寫了一個協議,需要完全理解我將我們的文檔傳遞給我們的客戶之前要進入什麼。

+1

BinaryReader旨在讀取用BinaryWriter寫出的內容。所以嘗試用BinaryWriter寫出不同長度的字符串,你應該能夠找出協議。 –

+0

但是你最好弄清楚UDP協議是如何給你發送數據的,當它不在字符串的前面(這很可能),這是徒勞的。 –

+0

http://msdn.microsoft.com/en-us/library/dd946975%28v=office.12%29。aspx – Ralf

回答

6

我發現source codeBinaryReader。它使用了一個名爲Read7BitEncodedInt()功能,查找該文檔和Write7BitEncodedInt()的文件後,我發現這一點:

值參數的整數在 時間寫出來的七位,開始與7個最低顯著位。一個字節的高位 指示在這個 之後是否有更多的字節被寫入。如果數值適合七位,則只需要一個字節的空間。 如果值不適合7位,則高位設置在第一個字節並寫出。然後將值移位7位,並寫入下一個 字節。重複該過程直到整個整數已被寫入 。

此外,拉爾夫發現this link,更好地顯示發生了什麼事情。

+0

但是如果二進制流是由運行在Big Endian機器上的程序寫入,然後通過Little Endian機器上的另一個程序讀取(例如,如果文件被傳輸)呢?我認爲他們錯過了。我正在編寫一個應用程序,以Big Endian(網絡字節順序)編寫流。 –