Вопрос неясен - какой тип столбца базы данных? Содержит ли он 6 байтов или 12 символов с шестнадцатеричной кодировкой байтов? В любом случае это не имеет ничего общего со специальными символами или кодировками.
Во-первых, 0x18 - это значение байта символа отмены на кодовой странице Latin 1, а не знак фунта . Это 0xA3. Кажется, что значения байтов в вопросе - это всего лишь латинские байты 1 для строки в шестнадцатеричном формате.
. NET строки - это Unicode (в частности, UTF16LE). Там нет ни строки UTF8, ни строки Latin1. Кодировки и кодовые страницы применяются при преобразовании байтов в строки или наоборот. Это делается с использованием класса Encoding и, например, Encoding.GetBytes
. В этом случае этот код преобразует байт в ожидаемую строковую форму, включая непечатаемый символ :
new byte[] {0xBA,0xA3,0x7D,0x40,0x18,0x6D};
var latinEncoding=Encoding.GetEncoding(1252);
var result=latinEncoding.GetString(dbBytes);
Результат:
º£}@m
С символом отмены между @
и m
.
Если столбец базы данных содержит байтовые значения в виде строк:
- занимает вдвое больше необходимого пространства и
- шестнадцатеричные значения должны быть преобразованы обратно в байты перед преобразованием в строки
The * Формат 1035 * используется для преобразования чисел или байтов в их шестнадцатеричную форму и наоборот. Для каждого значения байта ToString("x")
возвращает шестнадцатеричную строку.
Шестнадцатеричная строка может быть получена из исходного буфера с помощью:
var dbBytes=new byte[] {0xBA,0xA3,0x7D,0x40,0x18,0x6D};
var hexString=String.Join("",dbBytes.Select(c=>c.ToString("x")));
Существует множество вопросов, показывающих, как разбирать байтовую строку в байтовый массив . Я просто украду ответ LINQ Джареда Парсона:
public static byte[] StringToByteArray(string hex) {
return Enumerable.Range(0, hex.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hex.Substring(x, 2), 16))
.ToArray();
}
С этим мы можем проанализировать шестнадцатеричную строку в массив байтов и преобразовать ее в исходную строку:
var bytes=StringToByteArray(hexString);
var latinEncoding=Encoding.GetEncoding(1252);
var result=latinEncoding.GetString(bytes);