2008-10-20 2 views
0

어떻게 parapraph를 16 진수 표기법으로 변환 한 다음 원래의 문자열 형식으로 다시 변환 하시겠습니까?단락을 16 진수 표기법으로 변환 한 다음 다시 문자열

(C#을)

측면 참고 : 너 한테의 축소 하드 코어에 점점 O를 그것을/w를 최대한 축소 진수 형식으로 문자열을 넣어 것?

+0

base64에 대해 이야기하고 있습니까? 나는 대답을 게시 할 예정 이었지만, 다시 읽으면서 나는 당신이 의미하는 바를 잘 모르겠다. 변환하려는 문자열의 예제를 제공 한 다음 변환 된 동일한 문자열의 예제를 제공 할 수 있습니까? –

+0

Adam과 합의했습니다. 포스터가 원하는 것을 알고 있는지 잘 모르겠습니다. "Hello"를 "48656C6C6F"로 바꾸고 싶다면 꽤 쉽습니다. 그렇다고 생각하지 않습니다. – Coderer

+0

나는 숙제를 짐작하고있다. –

답변

1
public string ConvertToHex(string asciiString) 
{ 
    string hex = ""; 
    foreach (char c in asciiString) 
    { 
     int tmp = c; 
     hex += String.Format("{0:x2}", (uint)System.Convert.ToUInt32(tmp.ToString())); 
    } 
    return hex; 
} 
+0

stringbuilder를 사용하십시오! –

+0

예. 나는 C#의 첫 번째 작품을 잠시 썼다. Im 파이썬 해커 :) –

6

정확히 "진수 표기법"에 의해 무엇을 의미합니까? 이는 보통 텍스트가 아닌 바이너리 데이터를 인코딩하는 것을 의미합니다. 텍스트를 어떻게 든 인코딩 (예 : UTF-8 사용) 한 다음 각 바이트를 한 쌍의 문자로 변환하여 이진 데이터를 텍스트로 인코딩해야합니다.

using System; 
using System.Text; 

public class Hex 
{ 
    static void Main() 
    { 
     string original = "The quick brown fox jumps over the lazy dog."; 

     byte[] binary = Encoding.UTF8.GetBytes(original); 
     string hex = BytesToHex(binary); 
     Console.WriteLine("Hex: {0}", hex); 
     byte[] backToBinary = HexToBytes(hex); 

     string restored = Encoding.UTF8.GetString(backToBinary); 
     Console.WriteLine("Restored: {0}", restored); 
    } 

    private static readonly char[] HexChars = "ABCDEF".ToCharArray(); 

    public static string BytesToHex(byte[] data) 
    { 
     StringBuilder builder = new StringBuilder(data.Length*2); 
     foreach(byte b in data) 
     { 
      builder.Append(HexChars[b >> 4]); 
      builder.Append(HexChars[b & 0xf]); 
     } 
     return builder.ToString(); 
    } 

    public static byte[] HexToBytes(string text) 
    { 
     if ((text.Length & 1) != 0) 
     { 
      throw new ArgumentException("Invalid hex: odd length"); 
     } 
     byte[] ret = new byte[text.Length/2]; 
     for (int i=0; i < text.Length; i += 2) 
     { 
      ret[i/2] = (byte)(ParseNybble(text[i]) << 4 | ParseNybble(text[i+1])); 
     } 
     return ret; 
    } 

    private static int ParseNybble(char c) 
    { 
     if (c >= '0' && c <= '9') 
     { 
      return c-'0'; 
     } 
     if (c >= 'A' && c <= 'F') 
     { 
      return c-'A'+10; 
     } 
     if (c >= 'a' && c <= 'f') 
     { 
      return c-'A'+10; 
     } 
     throw new ArgumentOutOfRangeException("Invalid hex digit: " + c); 
    } 
} 

아니요, 이렇게하면 전혀 축소되지 않습니다. 꽤 반대로 - 당신은 훨씬 더 많은 텍스트로 끝날 것입니다! 그러나 바이너리 형식을 압축 할 수 있습니다. 임의의 2 진 데이터를 텍스트로 표현할 때 Base64는 일반 16 진수보다 효율적입니다. 전환에 Convert.ToBase64StringConvert.FromBase64String을 사용하십시오.

+0

놀라운! B >> 4는 무엇을합니까? 이동? –

+0

예, 바이트를 오른쪽으로 이동하므로 단일 니블 (0-15)로 끝납니다. 시각적으로 말하면 –

+0

, 어떻게 보입니까? 지금 변경되는 바이트의 값이 아닌가? –

0

C# 구현에 많은 도움을 줄 수는 없지만 간단한 구현 데이터 압축 알고리즘으로 LZW을 사용하는 것이 좋습니다.

0

아마도 우리가 묻는다면 아마도 답은 더 빨리 도달 할 수 있습니다. 무엇을 정말로하려고합니까? 일반적인 문자열을 16 진수 표현의 문자열로 변환하는 것은 웹에 대한 16 진수/인코딩 튜토리얼을 작성하지 않는 한 잘못된 접근 방식 인 것처럼 보입니다.

0
static byte[] HexToBinary(string s) { 
    byte[] b = new byte[s.Length/2]; 
    for (int i = 0; i < b.Length; i++) 
    b[i] = Convert.ToByte(s.Substring(i * 2, 2), 16); 
    return b; 
} 
static string BinaryToHex(byte[] b) { 
    StringBuilder sb = new StringBuilder(b.Length * 2); 
    for (int i = 0; i < b.Length; i++) 
    sb.Append(Convert.ToString(256 + b[i], 16).Substring(1, 2)); 
    return sb.ToString(); 
} 
관련 문제