C#中十六进制与字符串、字节数组的相互转换
十进制数转为十六进制字符串
在C#中,可使用Convert.ToString()方法将整数按指定进制转换为字符串。例如:
// 十进制 166 转为十六进制
Console.WriteLine("166 的十六进制表示: " + Convert.ToString(166, 16)); // 输出: a6
// 十六进制字符串转为十进制整数
Console.WriteLine("十六进制 CC 对应的十进制: " + Convert.ToInt32("CC", 16)); // 输出: 204
字符串与十六进制字节数组互转(含编码支持) 以下方法实现字符串与十六进制表示的字节数组之间的转换,支持自定义编码格式。
/// <summary>
/// 将字符串按指定编码转换为十六进制字节序列(以%分隔)
/// </summary>
/// <param name="input">输入字符串</param>
/// <param name="encoding">字符编码方式</param>
/// <returns>十六进制字符串,如 %48%65%6C%6C%6F</returns>
public static string ToHexString(string input, Encoding encoding)
{
if (string.IsNullOrEmpty(input)) return string.Empty;
byte[] bytes = encoding.GetBytes(input);
var result = new System.Text.StringBuilder();
foreach (byte b in bytes)
{
result.Append($"%{b:X2}");
}
return result.ToString();
}
/// <summary>
/// 将十六进制字符串(%分隔)还原为原始字符串
/// </summary>
/// <param name="hexString">格式如 %48%65%6C%6C%6F</param>
/// <param name="encoding">解码使用的编码</param>
/// <returns>原始文本内容</returns>
public static string FromHexString(string hexString, Encoding encoding)
{
if (string.IsNullOrEmpty(hexString)) return string.Empty;
var parts = hexString.Split(new char[] { '%' }, StringSplitOptions.RemoveEmptyEntries);
var bytes = new byte[parts.Length];
for (int i = 0; i < parts.Length; i++)
{
bytes[i] = Convert.ToByte(parts[i], 16);
}
return encoding.GetString(bytes);
}
字符串直接转十六进制字节数组 适用于已知十六进制字符串且不含分隔符的情况。
/// <summary>
/// 字符串形式的十六进制数据转为字节数组
/// </summary>
/// <param name="hexData">如 "48656C6C6F" 或 "48 65 6C 6C 6F"</param>
/// <returns>对应的字节数组</returns>
public static byte[] HexStringToBytes(string hexData)
{
hexData = hexData.Replace(" ", "").Trim();
if (hexData.Length % 2 != 0)
hexData += "0"; // 补齐偶数长度
int length = hexData.Length / 2;
byte[] result = new byte[length];
for (int i = 0; i < length; i++)
{
result[i] = Convert.ToByte(hexData.Substring(i * 2, 2), 16);
}
return result;
}
字节数组转十六进制字符串 将字节数组格式化为标准的十六进制字符串。
/// <summary>
/// 将字节数组转换为大写十六进制字符串
/// </summary>
/// <param name="data">原始字节数据</param>
/// <returns>格式如 "48656C6C6F"</returns>
public static string BytesToHexString(byte[] data)
{
if (data == null || data.Length == 0) return string.Empty;
var sb = new System.Text.StringBuilder(data.Length * 2);
foreach (byte b in data)
{
sb.Append(b.ToString("X2"));
}
return sb.ToString();
}
中文字符与十六进制互转 支持多种编码格式,如 UTF-8、GB2312 等。
/// <summary>
/// 将中文字符串转换为十六进制表示(可选逗号分隔)
/// </summary>
/// <param name="text">待转换的文本</param>
/// <param name="charset">编码类型,如 "utf-8"、"gb2312"</param>
/// <param name="separated">是否用逗号分隔每个字节</param>
/// <returns>十六进制字符串</returns>
public static string ToHexCode(string text, string charset, bool separated = false)
{
if (string.IsNullOrEmpty(text)) return string.Empty;
var encoding = Encoding.GetEncoding(charset);
byte[] bytes = encoding.GetBytes(text);
var result = new System.Text.StringBuilder();
for (int i = 0; i < bytes.Length; i++)
{
result.Append(bytes[i].ToString("X2"));
if (separated && i < bytes.Length - 1)
result.Append(",");
}
return result.ToString().ToLower();
}
/// <summary>
/// 将十六进制字符串还原为中文文本
/// </summary>
/// <param name="hex">如 "48656C6C6F" 或 "48,65,6C,6C,6F"</param>
/// <param name="charset">目标编码</param>
/// <returns>解码后的字符串</returns>
public static string FromHexCode(string hex, string charset)
{
if (string.IsNullOrEmpty(hex)) return string.Empty;
hex = hex.Replace(",", "").Replace(" ", "").Replace("\n", "").Replace("\\", "");
if (hex.Length % 2 != 0)
hex += "0"; // 补齐长度
var bytes = new byte[hex.Length / 2];
for (int i = 0; i < bytes.Length; i++)
{
try
{
bytes[i] = byte.Parse(hex.Substring(i * 2, 2), System.Globalization.NumberStyles.HexNumber);
}
catch
{
throw new ArgumentException($"无效的十六进制值:{hex.Substring(i * 2, 2)}");
}
}
var encoding = Encoding.GetEncoding(charset);
return encoding.GetString(bytes);
}