Что именно вы подразумеваете под «шестнадцатеричной нотацией»? Обычно это относится к кодированию двоичных данных, а не к тексту. Вам нужно каким-то образом закодировать текст (например, с использованием 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 для конверсий.
Вы говорите о base64? Я собирался опубликовать ответ, но при повторном чтении я не уверен, что вы знаете, что вы имеете в виду. Можете ли вы привести пример строки, которую вы хотите преобразовать, а затем пример одной и той же строки? – 2008-10-20 19:47:18
Согласен с Адамом - я не уверен, что плакат знает, чего он хочет. Если вы хотите превратить «Hello» в «48656C6C6F», это довольно просто, но я не думаю, что все в порядке. – Coderer 2008-10-20 20:26:24
Я угадываю домашнее задание. – 2008-10-20 21:17:20