2011-08-29 6 views
1

"74657374696e67"("테스트 중"), 16 진수로 인코딩 된 유니 코드 텍스트와 같은 문자열이 있습니다. 다시 읽을 수있는 출력으로 변환해야합니다. .NET에서이 작업을 수행하는 방법은 무엇입니까?16 진수로 인코딩 된 문자열을 유니 코드 텍스트로 변환

업데이트 :

텍스트는 원래 다음 VBA (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 
+0

헥스의 숫자는 바이트를 나타냅니다 ,하지만 어떻게 유니 코드 텍스트는 처음부터 바이트로 인코딩 된? 그 중 하나 이상의 선택이 있습니다. –

+0

당신이 인용 한 인코딩 기능은 구조를 넘어 255 이상의 유니 코드 코드 포인트를 혼란시킬 것이므로 효과적으로 16 진수 문자열이 유니 코드가 아닌 라틴 -1 텍스트를 설명한다고 가정 할 수 있습니다. –

답변

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 
+0

이 코드는 어떤 이유로 작동하지 않습니다. ArgumentOutOfRangeException, "색인 및 길이는 문자열 내의 위치를 ​​참조해야합니다." – SharpAffair

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

EnHex 및 DeHex 원래 문자열의 문자가 ASCII 일부 인코딩 또는 인코딩된다고 가정되는 날 것으로 보인다 모든 문자가 0-255 범위에있는 다른 문자 집합입니다. 따라서 모든 문자는 2 자리 16 진수로 나타낼 수 있습니다. 다음 .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 일을 정확히 것입니다. 그것을 사용하여 결과와 기대를 테스트하십시오.

관련 문제