在.NET中如何将字符串转换为字节数组?

79

我有一个字符串需要在.NET中转换为等价的字节数组。

这应该很简单,但我现在有点脑抽。

4个回答

103

4
System.Text.Encoding 中有很多编码方式,不仅仅是 Unicode,请确保你了解需要使用哪种编码方式。 - Joel Coehoorn
1
Joel:因此我写了“例如”。;-)但是你的评论当然是有效的。 - Konrad Rudolph
尝试帮助展示非UTF16编码的位置-我可能可以用更好的措辞。 - Joel Coehoorn
你能否看一下我的与之相关的问题 - Moeez

43

首先确定您需要哪种编码:您需要先了解一些有关Unicode的知识。

接下来确定对应的System.Text.Encoding。我的.NET核心参考卡描述了大多数常见的编码方式,以及如何获取实例(例如通过Encoding的静态属性或调用Encoding.GetEncoding)。

最后,确定您是要一次性获取所有字节(这是最简单的方法 - 只需调用一次Encoding.GetBytes(string)即可完成),还是需要将其分成块 - 在这种情况下,您将需要使用Encoding.GetEncoder,然后逐位进行编码。编码器负责在调用之间保持状态,以防您需要在字符一半时中断,例如。


10
@Mehrdad:你绝对需要理解编码。编码定义了将字符串转换为字节数组的过程。压缩和加密是完全不同的问题。否则就像说图像格式对于保存图片文件并不重要一样,虽然许多不同的图像格式可能可行,但必须有一个格式被涉及,这是根据定义而来的。 - Jon Skeet
9
@Mehrdad:不,用户确实需要知道编码方式。即使UTF-16在某种程度上是.NET的自然编码方式,也并不意味着它就是用户想要使用的编码方式。编写数据的目的是为了可以再次读取 - 而这将需要使用相同的编码方式。OP提到“相等的字节数组”表明他们可能不知道编码方式的存在,如果你打算在文本和二进制表示之间进行转换,理解编码方式是非常重要的。 - Jon Skeet
8
我见过无数人因为不理解编码而未能正确保存信息。在我的经验中,教育他们这个主题比使用 Buffer.BlockCopy 并假设这是他们想要的方法更好。 - Jon Skeet
5
@Mehrdad:但是最终会有某个人解释这些字节。你说的压缩/加密部分不需要考虑这一点是对的,但是无论如何将其转回字符串的内容都需要考虑......如果永远没有人去解释数据,那么它存在的意义就不大了。因此,确实仍需要选择一种编码方式,并确保它被一致地使用。你决定使用哪种编码方式有一定程度的自由,只要它能编码所有的文本,尽管它会影响空间等因素。然而,任意并不等于无关紧要。 - Jon Skeet
6
是的,绝对是这样的。就像您必须选择图像格式如果您想将图片保存到磁盘中一样。尽可能地使用这个类比。字符串不是由字节组成的(从概念上讲),所以为了将其转换为字节,您必须进行某种类型的转换...而这正是编码所做的事情。 - Jon Skeet
显示剩余33条评论

20

您正在使用哪种编码方式?Konrad 已经基本掌握了,但还有其他的编码方式存在,如果选择了错误的编码方式,可能会得到不良结果:

byte[] bytes = System.Text.Encoding.XXX.GetBytes(text)

其中XXX可以是:

ASCII
BigEndianUnicode
Default
Unicode
UTF32
UTF7
UTF8

10

就像这样:

    string test = "text";
    byte[] arr = Encoding.UTF8.GetBytes(test);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接