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


Answers:


98

您需要使用编码System.Text.Encoding)来告诉.NET您期望输出什么。例如,在UTF-16(= System.Text.Encoding.Unicode)中

var result = System.Text.Encoding.Unicode.GetBytes(text);

4
System.Text.Encoding中的编码远不止Unicode:要确保您了解所需的编码。
Joel Coehoorn

1
乔尔:因此,我写了“例如”。;-)但是您的评论当然有效。
康拉德·鲁道夫

:)试图帮助显示非UTF16编码的位置-我可能会措辞更好。
乔尔·科恩荷恩

你能看到我有关的问题吗?
Moeez

41

首先确定您想要哪种编码:首先需要对Unicode有所了解。

接下来找出System.Text.Encoding对应的。我的Core .NET refcard描述了大多数常见的refcard,以及如何获取实例(例如,通过的静态属性Encoding或通过调用)Encoding.GetEncoding

最后,计算一下是否要一次所有字节(这是最简单的工作方式,只需一次调用Encoding.GetBytes(string),然后完成),或者是否需要将其分成大块-在这种情况下,想要使用Encoding.GetEncoder,然后一次编码一点。编码器负责保持两次调用之间的状态,以防万一您需要中断某个字符的情况。


9
@Mehrdad:绝对可以。编码定义了从字符串到字节数组的转换。压缩和加密是完全不同的事情。否则,这就像说要将图片另存为文件时,图像格式无关紧要-许多不同的图像格式都可以,但从定义上讲,必须涉及其中一种
乔恩·斯基特

8
@Mehrdad:不,用户确实需要知道编码。仅仅因为从某种意义上说UTF-16是.NET的自然编码并不意味着它就是他想要使用的编码。写入数据的重点是可以再次读取数据-这将需要使用相同的编码。OP提到“字节的等效数组”这一事实表明,他们并不知道甚至存在编码,因此,如果要在文本和二进制表示之间进行转换,则了解编码至关重要
乔恩·斯基特

8
我已经看到无数人由于不了解编码而无法正确保存信息。以我的经验,对他们进行有关该主题的教育是比使用Buffer.BlockCopy假设这是他们想要的更好的方法。
乔恩·斯基特

5
@Mehrdad:但是以后有人会解释这些字节。您说的很对,压缩/加密部分不需要关心,但是以后将要把它重新转换为字符串的事情绝对是必要的……而且,如果没有去解释数据,那就没有什么了指出它在那里。因此,是的,您仍然需要选择一种编码,并确保使用一致。哪种编码您决定使用是有点任意的,只要它可以编码所有文字,虽然会影响空间等任意是不一样的,虽然无关。
乔恩·斯基特

6
@Mehrdad:是的,绝对。就像您要将图像保存到磁盘一样,必须选择图像格式。尽可能使用该类比。字符串不是从字节组成的(从概念上来说),因此要转换字节,您必须进行某种转换...而这正是编码。
乔恩·斯基特

19

您正在使用什么编码?Konrad的性能下降了很多,但是还有其他问题,而错误的结果可能会让您傻乎乎的:

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

XXX可以在哪里:

ASCII
BigEndianUnicode
Default
Unicode
UTF32
UTF7
UTF8

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.