将字节转换为字符串再转换回来:C# 中十六进制代码的魔法
\n\n您是否曾想过,计算机是如何看到图片、音乐或纯文本文件的?这一切都只是字节序列。但字节并不方便向用户展示或在 URL 中传输。这时,十六进制字符串(hex string)就派上用场了——它是二进制数据的紧凑且可读的表示形式。
\n\n想象一下:您正在编写一个加密模块,处理哈希值,通过 JSON 传输二进制数据,或者记录数据包的内容。然后——啪!——您需要将字节数组转换为可读的字符串。或者反过来,从十六进制字符串恢复原始字节。听起来很熟悉吧?这个问题是 Stack Overflow 上最热门的问题之一,今天我们将一劳永逸地解决它。欢迎来到 pythonlib.ru——您的编程世界指南。
\n\n为什么需要将字节数组转换为十六进制字符串?
\n\n让我们直接进入正题。字节数组(byte[])是原始数据:0 到 255 的数字。人类很难阅读它们,而且在某些文本协议(HTTP、JSON)中,它们甚至可能破坏格式。十六进制字符串解决了这两个问题:
\n\n- \n
- 紧凑性:一个字节变成两个字符(例如,255 → "FF")。 \n
- 安全性:字符串中只保留安全字符(0-9, A-F)。 \n
- 便利性:十六进制字符串易于复制、比较和记录。 \n
您很可能在 MD5、SHA256 哈希值或授权令牌中见过这样的字符串。现在您知道它们“在底层”是如何工作的了。
\n\n方法 #1:经典方法——BitConverter(简单快速)
\n\nC# 中最流行的方法是使用内置类 BitConverter。它从 .NET 的第一个版本就存在,并且无需任何额外麻烦即可工作。
转换 byte[] → hex string
\n\nbyte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = BitConverter.ToString(data);\nConsole.WriteLine(hexString); // 输出: 0F-1A-FF-00\n\n很简单,对吧?但有一个细节:字符对之间会插入连字符。如果连字符对您有影响,可以轻松移除它:
\n\nstring hexString = BitConverter.ToString(data).Replace("-", "");\nConsole.WriteLine(hexString); // 输出: 0F1AFF00\n\n优点:代码最少,内置方法,对初学者友好。
\n缺点:多余的连字符(需要删除),中间字符串会占用少量内存。
反向转换:hex string → byte[]
\n\n反向操作稍微复杂一些。BitConverter 只能单向转换。但我们不会放弃——编写一个简单的解析器:
\n\npublic static byte[] HexStringToBytes(string hex)\n{\n // 移除可能的连字符和空格\n hex = hex.Replace("-", "").Replace(" ", "");\n int length = hex.Length;\n byte[] bytes = new byte[length / 2];\n for (int i = 0; i < length; i += 2)\n {\n bytes[i / 2] = Convert.ToByte(hex.Substring(i, 2), 16);\n }\n return bytes;\n}\n\n// 使用示例:\nstring hex = "0F1AFF00";\nbyte[] result = HexStringToBytes(hex);\n// result: { 0x0F, 0x1A, 0xFF, 0x00 }\n\n这个方法使用 Convert.ToByte 并指定基数为 16——可靠且可读。但对于大型数组,Substring 会创建许多临时字符串。对于生产环境代码,最好使用 Span<T> 或带字符索引的循环。
方法 #2:现代方法——Convert.ToHexString (.NET 5+)
\n\n从 .NET 5 开始,微软添加了期待已久的 Convert.ToHexString 方法。它运行速度快且没有连字符。
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = Convert.ToHexString(data);\nConsole.WriteLine(hexString); // 输出: 0F1AFF00\n\n太棒了!没有连字符,没有 Replace。对于反向操作,有 Co