当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何在.NET中将字符串转换为字节数组?》经验,为你挑选了4个好方法。

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

这应该很容易,但我有脑痉挛.



1> Konrad Rudol..:

您需要使用encoding(System.Text.Encoding)来告诉.NET您期望的输出.例如,在UTF-16(= System.Text.Encoding.Unicode)中:

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


System.Text.Encoding中的编码比Unicode更多:确保您了解所需的编码.

2> Jon Skeet..:

首先找出你想要的编码:你需要先了解一下Unicode.

接下来解决哪个System.Text.Encoding对应的问题.My Core .NET refcard描述了大多数常见的,以及如何获取实例(例如通过静态属性Encoding或通过调用Encoding.GetEncoding.

最后,弄清楚你是否想要一次完成所有字节(这是最简单的工作方式 - 一次调用Encoding.GetBytes(字符串)并完成)或者你是否需要将它分成块 - 在这种情况下你是'我想使用Encoding.GetEncoder,然后一次编码一下.例如,编码器负责保持调用之间的状态,以防你需要在角色中途中断.


@Mehrdad:你*绝对*做.编码*定义*从字符串到字节数组的转换.压缩和加密完全不同.否则,就像说当你想将图片保存为文件时图像格式无关紧要 - 许多不同的图像格式可能没问题,但根据定义,必须涉及***.
@Mehrdad:不,用户*需要知道编码.仅仅因为UTF-16在某种意义上说.NET*的自然编码*并不意味着它是他想要使用的编码.写出数据的重点是可以再次读取 - 这需要使用相同的编码.OP称为"等效字节数组"的事实表明他们不知道编码甚至存在,如果你要在文本和二进制表示之间进行转换,那么理解编码是非常重要的.
我见过*无数*人无法正确保存信息,因为他们还没有理解编码.根据我的经验,教育他们关于这个主题是一个比使用"Buffer.BlockCopy"和*假设*他们想要的更好的方法.
@Mehrdad:是的,绝对的.就像你*必须*如果你想将图片保存到磁盘,请选择图像格式.尽可能使用这个类比.字符串不是由字节组成的(概念上),所以为了将*转换为*字节,你必须经历某种转换......而这正是编码.
@Mehrdad:但*有人*将在稍后解释这些字节.你说压缩/加密部分不需要关心你是对的,但是后来把它转回一个字符串中的任何东西绝对会......如果没有人*曾经*将解释数据,那么它没有多大意义.所以是的,你仍然需要选择一种编码,并确保它的使用一致.您决定使用哪种编码*有点*任意,只要它可以对您的所有文本进行编码,尽管它会影响空间等.但任意不相同,但不相关.
@Mehrdad:那就是使用UTF-16.它仍然是一种编码 - 它只是内部用于`char`的自然编码.(你可能非常关心这样一个事实,即如果你的字符串都是ASCII,那就是它需要的两倍大.)
你有一个.NET图像类的例子,*可以*处理`Buffer.BlockCopy`?你不需要知道关于Unicode的**,但显然越多越好.但你*需要做出选择.如果你想编写一个隐藏该选项的`StringConverter`类并且*总是*使用`Encoding.UTF8`(或其他)然后继续 - 但你仍然在做出选择,我认为它实际上没有好处任何人都可以隐藏它.你迟早会遇到需要了解编码基础知识的情况,为什么不早点学习呢?
@Mehrdad:字符串不具有*编码(或者它总是UTF-16).如果它是从UTF-8读取的,它仍然在内部以UTF-16结尾.这不是你的方法不使用编码 - 它是*隐含的*,这是一个坏东西IMO.显然你需要使用*适当的*编码,但只是试图摆脱问题,好像它不存在是一个非常非常糟糕的想法IMO.保持对编码的无知是*不是前进的方向.如果要使用UTF-16,请明确执行(`Encoding.Unicode`).
@Mehrdad:这取决于"有效"的含义.根据定义,它始终包含UTF-16代码单元.它们不必映射到定义的Unicode字符,当然......但它们仍然是UTF-16.因此,如果要在私有范围内表示某些值,则以UTF-16表示 - 然后转换为相同私有范围字符的UTF-8(或其他)编码.如果你不知道使用什么编码,你*不应该*转换为字节.这就像要求保存图像而不指定图像格式 - 只是说不.
@Mehrdad:压缩然后解压缩字符串的某些二进制表示而不知道它是什么编码就可以了.将压缩二进制数据视为文本就不行了.任何时候你想要从字符串转换为二进制或反之,你*必须*知道要使用哪种编码,并且两种方式都是一致的.
@JonSkeet:你真的不需要编码,除非你(或其他人)实际上要*解释*字节,对吗?对于压缩,加密,混淆等任务,编码似乎有点无关......如果你不需要,没有理由去解决问题..
@Mehrdad:它总是一个`char`序列,它本身就是一个UTF-16代码单元.(请注意,这不是Unicode代码点.)但是,谈论"UTF-8字符串"是没有意义的.您可以拥有"字符串的UTF-8表示"(这将是一个字节数组),但这是另一回事.
@Mehrdad:编码*是*黑盒子.有很多黑盒子可供选择(不同的编码).您无需了解内部结构 - 但您需要从两个方面选择相同的转换.使用`BitConverter`的答案仍然是选择编码 - 它只是选择不调用它.如果我说"你需要选择一个字符串到字节的转换,通常是通过`System.Text.Encoding`",你会不会喜欢它?这是完全相同的事情,只是更笨拙地说IMO.再次考虑图像格式:您需要选择从像素到字节的格式.
@Mehrdad:使用'BitConverter`仍然会做出选择,只是没有意识到有*选择.(另外,说实话,我找不到你所说的"BitConverter"方法.)再次,考虑图像版本:如果有人问你如何将图片保存到磁盘,你不会问自然的问题格式?我不明白为什么有人知道字节和字符之间非常基本的区别,以及选择不同编码的能力应该引起争议.这并不像他们必须*实施*他们.

3> swilliams..:

您使用的是什么编码?康拉德得到了相当多的下降,但还有其他人,你可以用错误的结果得到愚蠢的结果:

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

哪里XXX可以:

ASCII
BigEndianUnicode
Default
Unicode
UTF32
UTF7
UTF8



4> Igal Tabachn..:

像这样:

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

推荐阅读
手机用户2502852037
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有