2009-09-27 84 views
4

我用BinaryWriter.Write()寫字符串,在MSDN,上述說明如下:如何BinaryWriter.Write()寫入字符串

在當前寫入一個長度前綴字符串 此流編碼 BinaryWriter,並且根據所使用的編碼和 將特定字符被寫入流 前進 流的當前位置在 中。

我認爲長度前綴是固定大小;但實際上它是可變大小的。 該方法如何計算前綴長度的任何細節?

+2

這是一個可變長度編碼。如果字符串長度小於128個字節,則長度可以用單個字節表示。有關該算法的說明,請參閱http://www.informit.com/guides/content.aspx?g=dotnet&seqNum=701。 – 2013-07-11 20:50:15

+0

這是一個4年前問的問題,無論如何感謝評論:-) – CMinus 2013-07-13 00:14:44

回答

6

對於.NET 4.0及以上,MSDN also says

長度前綴字符串代表由前綴字符串包含的字符串的長度的單一字節或字的串長度。此方法首先將字符串的長度寫爲UTF-7編碼的無符號整數,然後通過使用BinaryWriter實例的當前編碼將許多字符寫入流

對於更早的版本中,它表示:

長度前綴字符串代表由前綴字符串包含的字符串的長度的單一字節或字的串長度。此方法首先將字符串的長度寫爲四字節無符號整數,然後通過使用BinaryWriter實例的當前編碼將許多字符寫入流

+0

它是如何決定是讀/寫一個單字節還是一個4字節的單詞? – BlueMonkMN 2010-02-04 14:25:01

+0

奇怪的是,當我遵循該鏈接時,我得到:「此方法首先將字符串的長度寫爲UTF-7編碼的無符號整數。」對「四字節無符號整數」沒有提及。 – 2013-07-11 20:46:30

+0

@JimMischel如果您在2009年發佈此線程時將框架版本更改爲較早版本,則該語言將更改爲上面顯示的內容。 – 2013-07-12 00:15:00

10

前綴使用無符號LEB128格式編碼:http://en.wikipedia.org/wiki/LEB128

基本上,如果在長度爲127個或更少,一個字節被寫入。如果它更大,則設置高位,並寫入下一個長度的7位。如果仍然沒有足夠的位(長度爲16k或更大),則再次設置高位,並且寫入另外的7位。

因此,存儲長度將需要儘可能多的字節,每個字節將有7位長度,高位將告訴是否存在長度的另一個字節。