将十六进制编码的字符串转换为unicode文本

时间:2011-08-29 19:46:36

标签: .net string hex

我有像“74657374696e67”(即“测试”)这样的字符串,十六进制编码的unicode文本。需要将其转换回可读输出。 如何在.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 :(得分:0)

有趣的问题。

谷歌搜索了一下我在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

答案 1 :(得分:0)

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;
}

答案 2 :(得分:0)

在我看来,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();
    }

这正是online hex decoder正在做的事情。用它来测试你的结果和期望。

答案 3 :(得分:0)

只需使用Chr([hex code, e.g. &H74])即可。唯一的问题是,在使用此解决方案之前,您需要自己解析代码。如果你有unicode字符,请使用ChrW()

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