Преобразование абзаца в шестнадцатеричное примечание, а затем обратно в строку - PullRequest
0 голосов
/ 20 октября 2008

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

(C #)

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

Ответы [ 5 ]

6 голосов
/ 20 октября 2008

Что именно вы подразумеваете под "шестнадцатеричным обозначением"? Это обычно относится к кодированию двоичных данных, а не текста. Вам нужно как-то кодировать текст (например, используя 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 = "0123456789ABCDEF".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 для преобразований.

1 голос
/ 20 октября 2008
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 голосов
/ 30 июня 2009
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();
}
0 голосов
/ 22 октября 2008

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

0 голосов
/ 20 октября 2008

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

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