将字符串转换为C#中的字节数组:完整指南

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

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

开始课程

“字符串”和“字节”:为什么这永远是程序员的头疼问题?

\n

想象一下这个场景:你用C#编写一个网络应用程序,向服务器发送数据,结果输出的是一堆乱码。或者你加密了一个密码,但在另一端却无法解密。熟悉吗?问题的根源往往在于字符串与字节数组之间的错误转换(反之亦然)。

\n

Stack Overflow上关于“Converting string to byte array in C#”的问题获得了数千次浏览,这并非偶然。这是文件操作、加密、序列化和网络通信的基础。如果不理解这个主题,你将会反复踩坑。让我们一劳永逸地弄清楚如何正确地进行转换。

\n\n

为什么不能直接简单地将字符串转换为字节?

\n

天真的做法是对字符使用BitConverter.GetBytes()?不。问题在于字符串是一个由字符(char,在C#中占2个字节)组成的抽象概念。而字节数组是原始数据,它依赖于编码。

\n

同一个字符“A”在UTF-8编码中占1个字节,在UTF-16中占2个字节,在UTF-32中占4个字节。如果你选择了错误的编码,数据将会丢失。记住主要规则:始终显式指定编码。

\n\n

最流行的方法:Encoding.UTF8.GetBytes()

\n

这是你在90%的情况下会使用的方法。UTF-8是Web、JSON和大多数API的事实标准。

\n\n
using System;\nusing System.Text;\n\nclass Program\n{\n    static void Main()\n    {\n        string original = "Привет, мир! 🌍";\n        \n        // 将字符串转换为字节数组 (UTF-8)\n        byte[] utf8Bytes = Encoding.UTF8.GetBytes(original);\n        \n        // 反向转换(用于验证)\n        string restored = Encoding.UTF8.GetString(utf8Bytes);\n        \n        Console.WriteLine($"原始字符串: {original}");\n        Console.WriteLine($"字节数组 (长度 {utf8Bytes.Length}): {BitConverter.ToString(utf8Bytes)}");\n        Console.WriteLine($"恢复后的字符串: {restored}");\n    }\n}
\n\n

运行结果:

\n
原始字符串: Привет, мир! 🌍\n字节数组 (长度 18): D0-9F-D1-80-D0-B8-D0-B2-D0-B5-D1-82-2C-20-D0-BC-D0-B8-D1-80-21-20-F0-9F-8C-8D\n恢复后的字符串: Привет, мир! 🌍
\n\n

请注意:表情符号“🌍”占4个字节(F0-9F-8C-8D)。与过时的编码不同,UTF-8能够处理任何Unicode字符。

\n\n

其他流行的编码

\n
    \n
  • Encoding.ASCII — 仅支持7位字符(0-127)。不适用于西里尔字母或特殊字符——所有高于127的字符都会变成'?'
  • \n
  • Encoding.Unicode(即UTF-16LE)— C#内部用于存储字符串。每个字符占2个字节(代理对占4个字节)。
  • \n
  • Encoding.UTF32 — 每个字符严格占4个字节。资源消耗大,但可预测。
  • \n
  • Encoding.Default — 系统编码(ANSI)。请避免使用!它在不同计算机上可能不同。
  • \n
\n\n

使用BitConverter和MemoryStream进行转换

\n

有时需要获取字符串作为字符数组(char)的“原始”表示。这与编码后的字节不同,但对于底层操作可能有用。

\n\n
string text = "C#";\n// 获取char数组\nchar[] chars = text.ToCharArray();\n// 将每个char转换为2个字节(小端序)\nbyte[] rawBytes = new byte[chars.Length * sizeof(char)];\nBuffer.BlockCopy(chars, 0, rawBytes, 0, rawBytes.Length);\n\nConsole.WriteLine(BitConverter.ToString(rawBytes)); // 43-00-23-00
\n\n

此方法生成UTF-16LE编码的数组(与内存中的存储方式相同)。只有在你确切知道自己在做什么时才使用它。

\n\n

特殊情况:Base64

\n

如

博客

书籍推荐