2008-10-20 1 views
0

Как бы вы преобразовали параграф в шестнадцатеричную нотацию, а затем обратно в свою исходную строковую форму?Преобразование абзаца в шестнадцатеричную нотацию, затем обратно в строку

(C#)

Примечание стороны: будет положить строку в шестнадцатеричный формат сжиматься это самый без попадания в хардкор сокращение алго-х?

+0

Вы говорите о base64? Я собирался опубликовать ответ, но при повторном чтении я не уверен, что вы знаете, что вы имеете в виду. Можете ли вы привести пример строки, которую вы хотите преобразовать, а затем пример одной и той же строки? – 2008-10-20 19:47:18

+0

Согласен с Адамом - я не уверен, что плакат знает, чего он хочет. Если вы хотите превратить «Hello» в «48656C6C6F», это довольно просто, но я не думаю, что все в порядке. – Coderer 2008-10-20 20:26:24

+0

Я угадываю домашнее задание. – 2008-10-20 21:17:20

ответ

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

Нет, это не уменьшило бы его. Наоборот, вы получите гораздо больше текста! Однако вы можете сжать двоичную форму. С точки зрения представления произвольных двоичных данных в виде текста Base64 более эффективен, чем простой hex. Используйте Convert.ToBase64String и Convert.FromBase64String для конверсий.

0

Хотя я не могу много помочь в реализации C#, я бы очень рекомендовал LZW как простой в использовании алгоритм сжатия данных для вас.

0

Возможно, ответ может быть более быстро достигнут, если мы спросим: что вы действительно пытаетесь сделать? Преобразование обычной строки в строку шестнадцатеричного представления кажется неправильным подходом ко всему, если вы не делаете учебник по кодированию с шестнадцатеричным кодированием для Интернета.

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

 Смежные вопросы

  • Нет связанных вопросов^_^