Как конфертировать из Hex в Dump в C# - PullRequest
0 голосов
/ 17 января 2020

Я преобразую свой шестнадцатеричный код в дамп, чтобы получить специальный символ, такой как символ, но когда я пытаюсь преобразовать свой "0x18", я "\ u0018" это значение. Кто-нибудь может дать мне решение по этому вопросу.

Вот мой код:

    public static string FromHexDump(string sText)
    {
        Int32 lIdx;
        string prValue ="" ;
        for (lIdx = 1; lIdx < sText.Length; lIdx += 2)
        {
            string prString = "0x" + Mid(sText, lIdx, 2);
            string prUniCode = Convert.ToChar(Convert.ToInt64(prString,16)).ToString();
            prValue = prValue + prUniCode;
        }
        return prValue;
    }

Я использовал язык VB. У меня есть база данных, которая уже зашифровала текст к моему паролю, и значение BAA37D40186D вот так, поэтому я oop сделаю это на шаге 2, и ей понравится 0xBA,0xA3,0x7D,0x40,0x18,0x6D, и результат VB получится вот так º£}@m

Ответы [ 3 ]

0 голосов
/ 17 января 2020

Вопрос неясен - какой тип столбца базы данных? Содержит ли он 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.

Если столбец базы данных содержит байтовые значения в виде строк:

  1. занимает вдвое больше необходимого пространства и
  2. шестнадцатеричные значения должны быть преобразованы обратно в байты перед преобразованием в строки

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);
0 голосов
/ 17 января 2020

Прежде всего вам не нужен дамп, кроме Unicode, я бы рекомендовал прочитать о Unicode / Encoding et c и почему это проблема со строками.

PS: решение: StackOverflow

0 голосов
/ 17 января 2020

Вы можете использовать этот код:

var myHex = '\x0633';
var formattedString += string.Format(@"\x{0:x4}", (int)myHex);

Или вы можете использовать этот код из MSDN (https://docs.microsoft.com/en-us/dotnet/csharp/programming-guide/types/how-to-convert-between-hexadecimal-strings-and-numeric-types):

string hexValues = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
string[] hexValuesSplit = hexValues.Split(' ');
foreach (string hex in hexValuesSplit)
{
    // Convert the number expressed in base-16 to an integer.
    int value = Convert.ToInt32(hex, 16);
    // Get the character corresponding to the integral value.
    string stringValue = Char.ConvertFromUtf32(value);
    char charValue = (char)value;
    Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}",
                        hex, value, stringValue, charValue);
}
...