如何将字节数组转换为十六进制字符串(C#):完整指南

面向初学者的在线Python训练器

轻松学习Python,无需理论负担。在浏览器中直接解决带自动检查的实践任务,无需安装任何东西。

开始课程

将字节转换为字符串再转换回来: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
\n\n

您很可能在 MD5、SHA256 哈希值或授权令牌中见过这样的字符串。现在您知道它们“在底层”是如何工作的了。

\n\n

方法 #1:经典方法——BitConverter(简单快速)

\n\n

C# 中最流行的方法是使用内置类 BitConverter。它从 .NET 的第一个版本就存在,并且无需任何额外麻烦即可工作。

\n\n

转换 byte[] → hex string

\n\n
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = BitConverter.ToString(data);\nConsole.WriteLine(hexString); // 输出: 0F-1A-FF-00
\n\n

很简单,对吧?但有一个细节:字符对之间会插入连字符。如果连字符对您有影响,可以轻松移除它:

\n\n
string hexString = BitConverter.ToString(data).Replace("-", "");\nConsole.WriteLine(hexString); // 输出: 0F1AFF00
\n\n

优点:代码最少,内置方法,对初学者友好。
\n缺点:多余的连字符(需要删除),中间字符串会占用少量内存。

\n\n

反向转换:hex string → byte[]

\n\n

反向操作稍微复杂一些。BitConverter 只能单向转换。但我们不会放弃——编写一个简单的解析器:

\n\n
public 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> 或带字符索引的循环。

\n\n

方法 #2:现代方法——Convert.ToHexString (.NET 5+)

\n\n

从 .NET 5 开始,微软添加了期待已久的 Convert.ToHexString 方法。它运行速度快且没有连字符。

\n\n
byte[] data = { 0x0F, 0x1A, 0xFF, 0x00 };\nstring hexString = Convert.ToHexString(data);\nConsole.WriteLine(hexString); // 输出: 0F1AFF00
\n\n

太棒了!没有连字符,没有 Replace。对于反向操作,有 Co

博客

书籍推荐