2011-01-06 73 views
17

這真讓我困惑,比如說我想將一個整數保存到一個文件中,int x = 56,這個二進制數作爲內存中的56的表示形式的ascii相當於 00000000 00000000 00000000 00111000,這就是:null null null 8並將其寫入文件?我對麼?有人可以解釋這些雙重功能,我應該什麼時候使用他們每個人?即時通訊使用C#順便說一句。 thanx提前!一個Streamwriter和一個二進制打字機有什麼區別?

+0

這是二進制表示,而不是ASCII。 – 2011-01-06 11:25:10

+1

00111000 = 0 * 1 + 0 * 2 + 0 * 4 + 1 * 8 + 1 * 16 + 1 * 32 + 0 * 64 + 0 * 128 = 56。 – 2011-01-06 12:31:06

回答

2

StreamWriter用於文本,BinaryWriter寫入要寫入的實際二進制表示形式。我不是100%確定,但幾乎:)。

14

二進制寫入器寫入整數的內存中二進制表示。流寫入器寫入ASCII表示。一般來說,前者可以更加緊湊和高效(考慮編寫整數23861398 - 二進制編寫器將需要4個字節,但根據編碼,流編寫器需要8,16甚至32個),但後者導致純文本舊文本。

19

從MSDN頁StreamWriterBinaryWriter,你可以清楚地看到不同之處:

的StreamWriter:

實現一個TextWriter在特定 編碼寫 字符流。

和:

的BinaryWriter:

在二進制寫入原始類型到一個 流和支持寫入字符串 特定的編碼。

第一個寫的東西作爲文本,二進制,little endian第二寫道,所以int x = 56將被寫入00111000 00000000 00000000 00000000

5

從我能分辨出來... StreamWriter更多的是文本和BinaryWriter是原始類型,包括特定編碼的字符串。儘管BinaryWriter用二進制編寫,但對於那些以表面看待事物的人來說,這是一種誤導......就像我所做的那樣。我認爲,當我向底層流寫入一個整數時,它實際上將它寫入二進制文件,我可以再次讀取它作爲1和0的流。 爲了把東西放下,因爲它看起來在代碼:

MemoryStream stream = new MemoryStream(); 

BinaryWriter bw = new BinaryWriter(stream); 

bw.Write(35); 

// is equivalent to doing: 

stream.Write(BitConverter.GetBytes((int)35), 0, 4); 

雖然使用的BinaryWriter位轉移到提取字節和BitConverter使用不安全的指針鑄造,結果是一樣的。一個int是32位或4個字節的長度,它所做的只是將表示該int的字節寫入其基礎流。

StreamWriter的不只是它的意思的文字同樣的事情,所以整數不會被轉換爲字節,而是以字符...這是類似於寫作:

byte[] buffer = Encoding.UTF8.GetBytes("my string here 1234"); 
stream.Write(buffer, 0, buffer.Length); 

這就是爲什麼我說這是寫在二進制文件中的誤導,因爲它的確在技術上。將每個寫入的字節分解成若干位,並獲得二進制值。然而,說它將原始類型寫成字節數組會更有意義。如果您要將流轉換爲字符串,則不會得到1和0的字符串。

相關問題