C#实现字符串与16进制互转的实用代码

周予安
周予安
发布时间:2026-10-13 | 2人浏览过
原创

在C#开发中,经常需要将文本内容编码为十六进制字符串以便传输或存储,反之亦然。本文总结了常用的字符串与十六进制互转方案,涵盖基于字符编码的手动解析以及利用内置类库的类型转换。

准备工作:理解核心转换场景

C#中涉及此类转换的主要场景包括:

  • 文本转十六进制:将普通字符串中的每个字符转换为对应的ASCII或Unicode码值,并格式化为16进制字符串。
  • 十六进制转文本:解析包含空格或分隔符的十六进制串,将其还原为原始字符。
  • 数值类型转换:直接将表示数值的16进制字符串解析为 int、float 或字节数组。

操作步骤

第1步:将字符串转换为十六进制字符串

目的:获取字符串中每个字符的十六进制值,常用于调试或数据传输前的编码。

入口与动作:
使用 ToCharArray() 将字符串拆分为字符数组,遍历每个字符并通过 Convert.ToInt32() 获取其整数值,最后使用 String.Format("{0:X}", value) 格式化为大写十六进制字符串。

string input = "Hello World!";
char[] values = input.ToCharArray();
foreach (char letter in values) 
{
    // Get the integral value of the character.
    int value = Convert.ToInt32(letter);
    // Convert the decimal value to a hexadecimal value in string form.
    string hexOutput = String.Format("{0:X}", value);
    Console.WriteLine("Hexadecimal value of {0} is {1}", letter, hexOutput);
}

完成状态:控制台输出每个字符及其对应的十六进制码值(如 'H' -> '48')。

第2步:将十六进制字符串解析回字符

目的:解析形如 "48 65 6C..." 的字符串,还原出原始的文本内容。

入口与动作:
1. 使用 Split(' ') 分割字符串获取独立的十六进制子串。
2. 调用 Convert.ToInt32(hex, 16) 将16进制串转为十进制整数。
3. 通过 Char.ConvertFromUtf32(value) 或强制类型转换 (char)value 获取对应字符。

string hexValues = "48 65 6C 6C 6F 20 57 6F 72 6C 64 21";
string[] hexValuesSplit = hexValues.Split(' ');
foreach (String hex in hexValuesSplit) 
{
    // Convert the number expressed in base-16 to an integer.
    int value = Convert.ToInt32(hex, 16);
    // Get the character corresponding to the integral value.
    string stringValue = Char.ConvertFromUtf32(value);
    char charValue = (char)value;
    Console.WriteLine("hexadecimal value = {0}, int value = {1}, char value = {2} or {3}", hex, value, stringValue, charValue);
}

完成状态:成功输出解析后的字符,验证十六进制串与原文本的一致性。

第3步:将十六进制字符串直接转为数值类型

目的:当十六进制串代表纯数值时,避免逐字符解析,直接进行类型转换。

入口与动作:
1. **转整型**:使用 Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber)。
2. **转浮点型**:先解析为无符号整数 uint,再用 BitConverter.GetBytes() 转为字节数组,最后用 BitConverter.ToSingle() 提取浮点数。

// 转整型
string hexString = "8E2";
int num = Int32.Parse(hexString, System.Globalization.NumberStyles.HexNumber);
Console.WriteLine(num); // Output: 2274

// 转浮点型
string hexFloatStr = "43480170";
uint numUInt = uint.Parse(hexFloatStr, System.Globalization.NumberStyles.AllowHexSpecifier);
byte[] floatVals = BitConverter.GetBytes(numUInt);
float f = BitConverter.ToSingle(floatVals, 0);
Console.WriteLine("float convert = {0}", f); // Output: 200.0056

完成状态:获得准确的数值结果,适用于协议解析或数学计算。

第4步:利用 BitConverter 简化字节与十六进制互转

目的:快速生成可读性强的十六进制串(常带分隔符),或将已知的16进制明文转为字节流。

入口与动作:
1. **字节转16进制串**:使用 BitConverter.ToString(byte[]),默认返回带连字符的格式,可使用 Replace("-", "") 清理。
2. **自定义工具方法**:封装 StrToHex 和 HexToStr 以处理带空格的输入及 ASCIIEncoding 兼容性。

// 字节数组转带分隔符的十六进制字符串
byte[] vals = { 0x01, 0xAA, 0xB1, 0xDC, 0x10, 0xDD };
string str = BitConverter.ToString(vals);       // Output: 01-AA-B1-DC-10-DD
str = BitConverter.ToString(vals).Replace("-", ""); // Output: 01AAB1DC10DD

// 简易封装示例
public string StrToHex(string mStr)
{
    return ASCIIEncoding.Default.GetBytes(mStr).Aggregate("", (s, b) => s + b.ToString("X2"));
}

public string HexToStr(string mHex)
{
    mHex = mHex.Replace(" ", "").Replace("-", "");
    if (mHex.Length % 2 != 0) throw new ArgumentException("Invalid length");
    byte[] vBytes = new byte[mHex.Length / 2];
    for (int i = 0; i < mHex.Length; i += 2)
        vBytes[i / 2] = byte.Parse(mHex.Substring(i, 2), System.Globalization.NumberStyles.HexNumber);
    return ASCIIEncoding.Default.GetString(vBytes);
}

总结

通过灵活运用 Convert、Int32.Parse 和 BitConverter 类,可以高效解决C#中复杂的编码转换问题。建议根据实际应用场景(是否需要分隔符、是否涉及非ASCII字符)选择最合适的转换路径。以上就是C#实现字符串与16进制之间转换的详细代码与原理,更多关于C#数据处理的技巧请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表