2010-10-30 3 views
1

У меня есть шестигранный данные:Как преобразовать hex в строку?

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| 

Первая текстовая строка «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]); 
    } 
} 

Сначала он декодирует | разделенная строка. Который содержит unsigned шестнадцатеричные значения, которые кодирует следующий цикл.

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. Поэтому вам нужно итерировать строку и построить строку вывода по одному символу. Если вы столкнулись с escape-значком (=), то следующие два символа будут шестнадцатеричными цифрами Windows-1251. Декодируйте две цифры и добавьте результирующий символ в строку вывода. Петля до конца.

Смежные вопросы