2010-11-24 60 views
6

我想弄清楚我在做什麼錯在這裏。我試圖使用二進制閱讀器來緩解從流中獲取最初的四個字節到一個Int32值,告訴我剩餘數據需要多長時間。C#BinaryReader.Read()獲取垃圾開始

static void Main(string[] args) 
{ 
    MemoryStream stream = new MemoryStream(); 

    BinaryWriter writer = new BinaryWriter(stream); 

    string s = "Imagine this is a very very long string."; 

    writer.Write(s.Length); 
    writer.Write(s); 
    writer.Flush(); 

    BinaryReader reader = new BinaryReader(stream); 
    reader.BaseStream.Seek(0, SeekOrigin.Begin); 

    char[] aChars = new char[reader.ReadInt32()]; 
    reader.Read(aChars, 0, aChars.Length); 
    Console.WriteLine(new string(aChars)); 
} 

輸出應該是輸入,但我得到這個(請注意,從字符串的第一個字符更改爲字符串)

(想象一下,這是一個非常非常長的字符串

有人可以向我解釋我做錯了什麼?理想情況下,第二次讀取將繼續,直到總讀取字節等於前四個字節的值。此代碼只是一個簡化,以顯示我遇到的問題。流的位置似乎相反ect(4),但它幾乎看起來像從2開始讀取。

+0

MSDN,你想讀它。 – jason 2010-11-24 00:13:01

+0

呵呵,謝謝......而我是。對我來說不幸的是,BinaryReader沒有提及Writer存儲字符串的額外數據而不是字符串;) – James 2010-11-24 00:28:06

回答

8

BinaryWriter.Write(String)將長度爲前綴的字符串寫入此流。 這意味着它首先將字符串的長度寫入流,然後使用某種編碼寫入字符串。長度一次編碼七位,不是32位整數。

如果要從流中讀取數據,則應使用BinaryReader.ReadString,它從流中讀取長度爲前綴的字符串。