Преобразовать шестнадцатеричную строку в текст Unicode - PullRequest
1 голос
/ 29 августа 2011

У меня есть строки типа "74657374696e67" (то есть "тестирование"), текст в кодировке Юникод в шестнадцатеричном формате Необходимо преобразовать его обратно в читаемый вывод. Как это сделать в .NET?

Обновление:

Текст был изначально закодирован с использованием следующей функции Visual Basic 6:

Public Function EnHex(Data As String) As String
    Dim iCount As Double, sTemp As String
    Reset
    For iCount = 1 To Len(Data)
        sTemp = Hex$(Asc(Mid$(Data, iCount, 1)))
        If Len(sTemp) < 2 Then sTemp = "0" & sTemp
        Append sTemp
    Next
    EnHex = GData
    Reset
End Function

Декодирование было выполнено следующим образом:

Public Function DeHex(Data As String) As String
    Dim iCount As Double
    Reset
    For iCount = 1 To Len(Data) Step 2
        Append Chr$(Val("&H" & Mid$(Data, iCount, 2)))
    Next
    DeHex = GData
    Reset
End Function

Ответы [ 4 ]

0 голосов
/ 30 июня 2012

Просто используйте Chr([hex code, e.g. &H74]). Единственное, что вам нужно будет проанализировать код самостоятельно, прежде чем вы сможете использовать это решение. Если у вас есть символы Юникода, используйте ChrW().

http://msdn.microsoft.com/en-us/library/613dxh46(v=vs.71).aspx

0 голосов
/ 30 августа 2011
var myString = System.Text.Encoding.UTF8.GetString(DecodeHexString("74657374696e67"));

public static byte[] DecodeHexString(string str)
{
    uint num = (uint) (str.Length / 2);
    byte[] buffer = new byte[num];
    int num2 = 0;
    for (int i = 0; i < num; i++)
    {
        buffer[i] = (byte) ((HexToByte(str[num2]) << 4) | HexToByte(str[num2 + 1]));
        num2 += 2;
    }
    return buffer;
}

private static byte HexToByte(char val)
{
    if ((val <= '9') && (val >= '0'))
    {
        return (byte) (val - '0');
    }
    if ((val >= 'a') && (val <= 'f'))
    {
        return (byte) ((val - 'a') + 10);
    }
    if ((val >= 'A') && (val <= 'F'))
    {
        return (byte) ((val - 'A') + 10);
    }
    return 0xff;
}
0 голосов
/ 26 октября 2011

Мне кажется, что EnHex и DeHex предполагают, что символы в исходной строке кодируются в ascii или кодируются в некотором другом наборе символов, где все символы находятся в диапазоне 0-255.Следовательно, все символы могут быть представлены двухзначным шестнадцатеричным числом.Следующий код .NET (C #) расшифрует вашу шестнадцатеричную строку:

    public string DecodeHex(string input)
    {
        if (input.Length % 2 == 1)
            throw new ArgumentException("Invalid hex encoded string.");

        int len = input.Length / 2;
        StringBuilder output = new StringBuilder(len);
        for (int c = 0; c < len; ++c)
            output.Append((char)System.Convert.ToByte(input.Substring(c*2, 2), 16));

        return output.ToString();
    }

Это именно то, что делает этот онлайн шестнадцатеричный декодер .Используйте его, чтобы проверить свои результаты и ожидания.

0 голосов
/ 29 августа 2011

интересная проблема.

немного погуглив, я нашел это в VB.NET

Function FromHex(ByVal Text As String) As String

  If Text Is Nothing OrElse Text.Length = 0 Then
    Return String.Empty
  End If

  Dim Bytes As New List(Of Byte)
  For Index As Integer = 0 To Text.Length - 1 Step 2
    Bytes.Add(Convert.ToByte(Text.Substring(Index, 2), 16))
  Next

  Dim E As System.Text.Encoding = System.Text.Encoding.Unicode
  Return E.GetString(Bytes.ToArray)

End Function
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...