2010-10-30 117 views
1

我有一些十六進制數據:如何將十六進制轉換爲字符串?

48|65|6c|6c|6f|20|53|68|61|72|6f|6b|2e| 

20|3d|43|46|3d|46|30|3d|45|38|3d|45|32|3d|45|35|3d|46|32|0d|0a|0d|0a|2e|0d|0a| 

第一個文本字符串是 「你好Sharok不會」(不帶引號)。第二個文本字符串是「Привет」(不含引號,「Привет」是俄語的「Hello」)。如何將其轉換爲可讀文本(第一個字符串正常,第二個字符串失敗。)?

代碼頁:Windows的1251(CP1251

回答

2

對於第二個,你可以使用這個:

string input="20|3d|43|46|3d|46|30|3d|45|38|3d|45|32|3d|45|35|3d|46|32|0d|0a|0d|0a|2e|0d|0a"; 
byte[] bytes=input.Split('|').Select(s=>byte.Parse(s, System.Globalization.NumberStyles.HexNumber)).ToArray(); 
string text = Encoding.GetEncoding(1251).GetString(bytes); 

StringBuilder text2=new StringBuilder(); 
for(int i=0;i<text.Length;i++) 
{ 
    if (text[i]=='=') 
    { 
    string hex=text[i+1].ToString()+text[i+2].ToString(); 
    byte b=byte.Parse(hex, System.Globalization.NumberStyles.HexNumber); 

    text2.Append(Encoding.GetEncoding(1251).GetString(new byte[]{b})); 
    i+=2; 
    } 
    else 
    { 
    text2.Append(text[i]); 
    } 
} 

首先,它解碼|分離的字符串。其中包含=轉義的十六進制值以下循環解碼。

1

創建的所有窗口的Encoding對象-1251編碼,並解碼字節數組:

byte[] data = { 
    0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x53, 0x68, 0x61, 0x72, 0x6f, 0x6b, 0x2e 
}; 

string text = Encoding.GetEncoding(1251).GetString(data); 

第二組數據的不解碼成俄文字符,但到這個(包括在開始和一個空間換行符(CR + LF)結束每個三行):

=CF=F0=E8=E2=E5=F2 

. 

爲了得到你想要的字符串,你必須先對數據進行解碼轉換成字符串,然後從字符串中提取的十六進制代碼,轉換那些成字節,並解碼這些字節:

Encoding win = Encoding.GetEncoding(1251); 
string text = win.GetString(
    Regex.Matches(win.GetString(data), "=(..)") 
    .OfType<Match>() 
    .Select(m => Convert.ToByte(m.Groups[1].Value, 16)) 
    .ToArray() 
); 
3

第二個字符串不是Windows-1 251但是quoted-printable=CF=F0=E8=E2=E5=F2<CR><LF><CR><LF>.」並且其中的解碼字符實際上是Windows-1251。所以你需要迭代字符串,並逐個字符地構建輸出字符串。如果您運行轉義符號(=),則下兩個字符是Windows-1251的十六進制數字。解碼兩位數字並將結果字符添加到輸出字符串。循環直到結束。

相關問題