2011-12-01 83 views
4

我有一個字符串變量從中我得到以下字節與下面的循環:如何從字符串中適當地獲取字節?

Bytes I get: 1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

With that loop: 

    byte[] temp = new byte[source.Length]; 
    string x = ""; 
    for (int i = 0;i != source.Length;i++) 
    { 
    temp[i] = ((byte) source[i]); 
    } 

現在我想簡化操作,並使用編碼的GetBytes會。 問題是我無法適合適當的編碼。例如我得到幾個字節不正確:

Encoding.ASCII.GetBytes(source): 1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f 
Encoding.Default.GetBytes(source): 1e 05 55 3c e2 3f 6f 03 3f 1a 1d f4 51 6a 5e 3a ce 4e 04 3f 

我該如何擺脫該循環並使用Encoding的GetBytes?

以下是摘要:

Loop(correct bytes):    1e 05 55 3c *e2 *91 6f 03 *fe 1a 1d *f4 51 6a 5e 3a *ce *d1 04 *8c 

Encoding.ASCII.GetBytes(source): 1e 05 55 3c *3f *3f 6f 03 *3f 1a 1d *3f 51 6a 5e 3a *3f *3f 04 *3f 
Encoding.Default.GetBytes(source): 1e 05 55 3c e2 3f 6f 03 3f 1a 1d f4 51 6a 5e 3a ce 4e 04 3f 

謝謝!

增加:

我有一個字符串輸入十六進制,某事象:「B1807869C20CC1788018690341」 然後我轉移到這個字符串的方法:

private static string hexToString(string sText) 
{ 
    int i = 0; 
    string plain = ""; 
    while (i < sText.Length) 
    { 
    plain += Convert.ToChar(Convert.ToInt32(sText.Substring(i, 2), 16)); 
    i += 2; 
    } 
    return plain; 
} 
+1

如何從字節中獲取字符串「source」? –

+2

你能否提供有問題的字符串? – yas4891

+1

什麼是字符串編碼? –

回答

3

你hexToString正在傳輸的字節值Encoding.Default給定(通過十六進制謹慎)直接到unicode代碼點在範圍0-255。碰巧,這關係到28591代碼頁,所以如果你使用:

Encoding enc = Encoding.GetEncoding(28591); 

,並使用該enc,你應該得到正確的數據;但是,更重要的一點是,二進制數據與文本數據不同,並且不應使用string來保存任意二進制數。

+0

作品。你從哪裏知道它,它是28591? – John

+0

@John爲了回答這個問題,我寫了一個通過'Encoding.GetEncodings()'迭代所有的控制檯exe文件,並測試了所有這些文件; http://pastie.org/2948555 –

+0

@John但是又一次:if數據實際上並不是真正的文本數據,您不應該試圖將其保存在「字符串」中 –

2

。假定你正在試圖「解碼「字符串文字:
C#將字符串作爲Unicode存儲在內部。 所以,你可能想使用(正確)支持Unicode編碼

如:

Encoding.UTF8.GetBytes(source) 
Encoding.UnicodeEncoding.GetBytes(source) 

注意在MSDN