C# 将十六进制值转换为 UTF8 和 ASCII
本文关键字:UTF8 ASCII 转换 十六进制 | 更新日期: 2023-09-27 18:32:49
我正在尝试将字符串中的十六进制值转换为 ASCII 值和 UTF8 值。但是当我执行以下代码时,它会打印出我作为输入给出的相同的十六进制值
string hexString = "68656c6c6f2c206d79206e616d6520697320796f752e";
System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
byte[] dBytes = encoding.GetBytes(hexString);
//To get ASCII value of the hex string.
string ASCIIresult = System.Text.Encoding.ASCII.GetString(dBytes);
MessageBox.Show(ASCIIresult, "Showing value in ASCII");
//To get the UTF8 value of the hex string
string utf8result = System.Text.Encoding.UTF8.GetString(dBytes);
MessageBox.Show(utf8result, "Showing value in UTF8");
由于您正在命名一个变量hexString
,我假设该值已经编码为十六进制格式。
这意味着以下内容将不起作用:
string hexString = "68656c6c6f2c206d79206e616d6520697320796f752e";
System.Text.UTF8Encoding encoding=new System.Text.UTF8Encoding();
byte[] dBytes = encoding.GetBytes(hexString);
这是因为您将已编码的字符串视为纯 UTF8 文本。
您可能缺少将十六进制编码字符串转换为字节数组的步骤。
您可以使用显示此功能的 SO 帖子来执行此操作:
public static byte[] StringToByteArray(String hex)
{
int NumberChars = hex.Length/2;
byte[] bytes = new byte[NumberChars];
using (var sr = new StringReader(hex))
{
for (int i = 0; i < NumberChars; i++)
bytes[i] =
Convert.ToByte(new string(new char[2]{(char)sr.Read(), (char)sr.Read()}), 16);
}
return bytes;
}
因此,最终结果将是这样的:
byte[] dBytes = StringToByteArray(hexString);
//To get ASCII value of the hex string.
string ASCIIresult = System.Text.Encoding.ASCII.GetString(dBytes);
MessageBox.Show(ASCIIresult, "Showing value in ASCII");
//To get the UTF8 value of the hex string
string utf8result = System.Text.Encoding.UTF8.GetString(dBytes);
MessageBox.Show(utf8result, "Showing value in UTF8");
您应该首先将十六进制字符串转换为字节数组:
byte[] dBytes = Enumerable.Range(0, hexString.Length)
.Where(x => x % 2 == 0)
.Select(x => Convert.ToByte(hexString.Substring(x, 2), 16))
.ToArray();
我已经使用此方法转换了任何
public static string FromHex (string h) //Put your sequence of hex to convert to string.
{
if (h.Length % 2 != 0)
throw new ArgumentException("The string " + nameof(h) + " is not a valid Hex.", nameof(h));
char[] CharFromHex = new char[h.Length / 2];
int j = 0;
for (int i = 0; i < h.Length; i += 2)
{
string hexSubStr = h.Substring(i, 2);
CharFromHex[j] = (char)Convert.ToInt32(hexSubStr, 16);
j += 1;
}
StringBuilder str = new StringBuilder();
str.Append(CharFromHex);
return str.ToString();
}