将段落转换为十六进制符号,然后再转换为字符串
本文关键字:转换 然后 字符串 十六进制 段落 符号 | 更新日期: 2023-09-27 17:48:48
如何将parapraph转换为十六进制表示法,然后再转换回其原始字符串形式?
(C#)
附带说明:将字符串放入十六进制格式会使其在没有进入核心收缩算法的情况下收缩最大吗?
"十六进制表示法"到底是什么意思?这通常指的是对二进制数据进行编码,而不是对文本进行编码。您需要以某种方式对文本进行编码(例如使用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比纯十六进制更有效。使用Convert.ToBase64String和Convert.FromBase64String进行转换。
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;
}
虽然我对C#的实现没有太多帮助,但我强烈推荐LZW作为一种简单易实现的数据压缩算法供您使用。
如果我们问:你到底想做什么,也许可以更快地找到答案?将普通字符串转换为十六进制表示的字符串似乎是错误的方法,除非你正在为网络制作十六进制/编码教程。
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();
}