2010-06-16 62 views
2

我有一個字節數組,我編碼爲一個字符串:VB.NET編碼一個字符錯誤

Private Function GetKey() As String 
    Dim ba() As Byte = {&H47, &H43, &H44, &H53, &H79, &H73, &H74, &H65, &H6D, _ 
         &H73, &H89, &HA, &H1, &H32, &H31, &H36} 

    Dim strReturn As String = Encoding.ASCII.GetString(ba) 

    Return strReturn 
End Function 

然後我寫經IO.File.AppendAllText文件。 如果我打開該文件在010編輯器(以查看二進制數據)它顯示爲這樣:

47 43 44 53 79 73 74 65 6D 73 3F 0A 01 32 31 36

原始字節在位置11包含,並且編碼的字符串包含3F。 如果我改變編碼Encoding.Default.GetString,它給我:

47 43 44 53 79 73 74 65 6D 73 E2 80 B0 0A 01 32 31 36

任何幫助將是多不勝感激!

回答

2

Encoding.ASCII限於7位字符。即從0到127的字節值(& H00到& H7F)。 GetString將此範圍外的所有值設置爲& H3F,這是一個問號。

Encoding.Default是針對操作系統,它在我的電腦上是代碼頁1252當前ANSI代碼頁..

的ANSI代碼頁可以在不同的計算機是不同的 ,也可以是 改變單電腦,導致 數據損壞。對於最一致的結果,應用程序 應使用Unicode,如特定代碼頁的UTF-8 (代碼頁65001)或UTF-16代替 。

Encoding.UTF7會爲你在這裏工作:

Dim strReturn As String = Encoding.UTF7.GetString(ba) 

編輯:

用編碼代替我寫字節直接使用這樣的事情:

Dim key = GetKey() 
Dim f = System.IO.File.OpenWrite("output.txt") 
f.Seek(0, SeekOrigin.End) 
f.Write(key, 0, key.Length) 
f.Close() 

Private Function GetKey() As String 
    Dim ba() As Byte = {&H47, &H43, &H44, &H53, &H79, &H73, &H74, &H65, &H6D, &H73, &H89, &HA, &H1, &H32, &H31, &H36} 

    Return ba 
End Function 
+0

這給我 47 43 44 53 79 73 74 65 6D 73 C2 89 0A 01 32 31 36 其中有89個,還插入了C2。 我可能需要教育自己更多的編碼。 – 2010-06-16 16:08:54

+0

嗯......當用AppendAllText將它寫入文件時,它確實增加了C2。但是,爲什麼要先將字節轉換爲字符串,然後將字符串寫入文件?爲什麼不直接寫字節? – 2010-06-16 16:57:58

+0

我需要在將文件寫入文件之前通過加密函數運行字符串的選項。有時它會被加密,有時不會。我可以在編碼後刪除插入的C2字符...... – 2010-06-16 17:25:12