Как преобразовать гекс в строку? - PullRequest
1 голос
/ 30 октября 2010

У меня есть некоторые шестнадцатеричные данные:

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 Sharok» (без кавычек).Вторая текстовая строка - «Привет» (без кавычек «Привет» на русском языке - «Привет»).Как мне преобразовать это в читаемый текст (первая строка в порядке, вторая строка терпит неудачу.)?

Кодовая страница: Windows-1251 ( CP1251 )

Ответы [ 4 ]

3 голосов
/ 30 октября 2010

Вторая строка - не Windows-1251, а для печати в кавычках"=CF=F0=E8=E2=E5=F2<CR><LF><CR><LF>.", а декодированные символы в ней на самом деле - Windows-1251.Поэтому вам нужно перебрать строку и создать выходную строку один за другим.Если вы встретите escape-знак (=), то следующие два символа - это шестнадцатеричные цифры Windows-1251.Расшифруйте две цифры и добавьте полученный символ в строку вывода.Цикл до конца.

2 голосов
/ 30 октября 2010

Для второго вы можете использовать это:

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 голос
/ 30 октября 2010

Создайте объект Encoding для кодировки windows-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()
);
1 голос
/ 30 октября 2010
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...