.NET Преобразование из строки шестнадцатеричных значений в символы Юникода (поддержка разных кодовых страниц) - PullRequest
3 голосов
/ 22 декабря 2011

У меня есть строка шестнадцатеричных значений ...

String hexString = "8A65";

Мне нужно преобразовать эту строку в их эквиваленты в Юникоде. Сложность в том, что мне нужно поддерживать разные кодовые страницы, и некоторые кодовые страницы имеют «8A65» = один символ, тогда как другие кодовые страницы преобразуют его в два символа.

У меня нет предварительных сведений о том, какую кодовую страницу я буду использовать, пока мне не потребуется выполнить преобразование.

Я пробовал все виды вещей, таких как

byte[] original = Encoding.Unicode.GetBytes(hexString);
byte[] conv= Encoding.Convert(Encoding.Unicode, Encoding.GetEncoding(932), orig);
char[] chars = Encoding.GetEncoding(932).GetChars(conv);

Примечание: кодовая страница 932 на японском языке

РЕШЕНИЕ

string hexString = "8A65";
int length = hexString.length;
byte[] bytes = new byte[length / 2];

for (int i = 0; i < length; i += 2)
{
    bytes[i / 2] = Convert.ToByte(hexString.Substring(i, 2), 16);
}

char[] chars = Encoding.GetEncoding(932).GetChars(bytes);

Спасибо, pstrjds, вы спасатель!

Ответы [ 2 ]

2 голосов
/ 22 декабря 2011

Вам необходимо преобразовать шестнадцатеричную строку в байты (см. SO post ). Передача шестнадцатеричной строки в одну из кодировок для преобразования ее в байты просто дает вам байтовый эквивалент этих символов. Я предполагаю, что вам нужны два байта, которые представляет строка из 4 символов, поэтому декодируйте шестнадцатеричный код в байты, а затем вы можете использовать кодировку декодированных байтов, чтобы получить строку.

Encoding.{YourEncoding}.GetChars(hexBytes);
1 голос
/ 23 декабря 2011
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;

class Sample {
    static public void Main(){
        var data = "8A65";
        Regex regex = new Regex(@"(?<hex>[0-9A-F]{2})",RegexOptions.IgnoreCase | RegexOptions.Compiled);
        byte[] bytes = regex.Matches(data).OfType<Match>().Select(m => Convert.ToByte(m.Groups["hex"].Value,16)).ToArray();
        char[] chars = Encoding.GetEncoding(932).GetChars(bytes);
        Console.WriteLine(new String(chars));
   }
} 
...