2016-03-08 210 views
0

我正在從源讀取RAW數據。這個原始數據是一個字節序列。 餘字節序列存儲到我定義爲在以下VB.NET字節的數組:vb.net:使用Unicode將字節數組編碼爲字符串

Dim frame() as Byte 

所以上述陣列中的每個元件的範圍是[0-255]。

欲編碼每個這些字節轉換成ASCII的,UTF-8和Unicode所以我遍歷字節陣列(幀),並執行以下根據情況代碼段的代碼:

ASCII

For idxByte As Integer = 0 To Me.frame.Length - 1 
    txtRefs(idxByte).Text = Encoding.ASCII.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1)) 
Next 

注意:txtRefs是一個文本框的數組,它的長度與框架相同。

和同類其他兩個編碼:

UTF8

For idxByte As Integer = 0 To Me.frame.Length - 1 
    txtRefs(idxByte).Text = Encoding.UTF8.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1)) 
Next 

統一

For idxByte As Integer = 0 To Me.frame.Length - 1 
    txtRefs(idxByte).Text = Encoding.Unicode.GetString(String.Format("<{0}>", Encoding.GetString(frame, idxByte, 1)) 
Next 

ASCII和UTF8編碼似乎確定,但Unicode編碼似乎它不工作,或者我可能不理解Unicode編碼功能所有...

對於unicode,我通過執行上述循環獲得result以下。它是否正確?

回答

1

Encoding.Unicode是UTF-16 LE,所以它需要兩個字節才能給出正確的結果。例如

Dim input() As Byte = { 65, 0 } 
Dim x = Encoding.Unicode.GetString(input, 0, 1) 
Dim y = Encoding.Unicode.GetString(input, 0, 2) 
Console.WriteLine("x={0}, y={1}", x, y) 

X =,Y = A

不過,如果你輸入的每個字符,你可能不希望僅僅通過兩個字節從輸入數組單字節。您可能希望創建一個新的輸入數組以零第二個字節:

Dim input() As Byte = { 65, 0 } 
Dim x = Encoding.Unicode.GetString(input, 0, 1) 
Dim y = Encoding.Unicode.GetString(input, 0, 2) 
Dim z = Encoding.Unicode.GetString(New Byte() { input(0), 0 }) 
Console.WriteLine("x={0}, y={1}, z={2}", x, y, z) 

X = Y = A,Z = A

很難說沒有知道你的輸入和期望輸出。

+0

是的,我的輸入是單字節每個字符,所以在unicode的情況下,創建一個新的輸入數組與零爲第二個字節正在工作。現在我想知道如果我需要爲UTF-8做同樣的事情,因爲Encoding.UTF8.IsSingleByte返回false,所以在UTF-8的情況下,這是否正確遵循與unicode相同的方法?也就是說,爲第二個字節構建一個帶有零的新數組。 – user1624552

+0

@ user1624552 UTF-8更復雜,因爲它使用可變數量的字節 - 1到6個字節 - 取決於代碼點。 [This](https://en.m.wikipedia.org/wiki/UTF-8#Description)顯示了詳細信息 - 對於值<= 127,單個字節將起作用。我不確定我是否明白爲什麼要這樣做,因爲實際上您只是將值視爲ASCII或單字節OEM編碼。如果你想知道這些字符是如何用不同的編碼進行編碼的,那麼你可以使用Encoding.Unicode.GetBytes(Encoding.ASCII.GetString(frame))''與你想要的任何源/目標編碼。 – Mark

+0

我想要做的是例如:對於單個字節,將其字符resprentation轉換爲不同的編碼ASCII,UTF-8,unicode,....例如,字節97對應於ascii中的字符'a',字節97對應於unicode中的字符X,字節97對應於UTF-8中的字符X等等......等等,範圍爲[0-255] – user1624552

0

對於ASCII碼,每個字節是一個碼單元,是一個碼點,是一個字符,是一個字形。

對於UTF-8,每個字節是一個代碼單元,一個或多個是代碼點,一個或多個是字形。

對於UTF-16,每兩個字節是一個代碼單元,一個或多個是代碼點,一個或多個是字形。

要轉換一個字節序列,只需使用一個調用GetString爲適當的編碼實例。然後你將處理String,這是一個統計的Unicode/UTF-16碼點序列。

當字節對編碼沒有意義時,內置Encoding類使用替換字符(「?」)。如果您願意,您可以使用DecoderFallback異常創建一個實例,以便您能夠處理這些情況。例如,0xFF永遠不是有效的ASCII碼單元; 0xCD是UTF-8中的有效代碼單元,但0xCD 0x20序列無效。

想必您可以分開顯示用的字形。見TextElementEnumerator

相關問題