C#实现字符串与16进制互转的实用代码
在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#数据处理的技巧请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









