【问题标题】:How to convert byte array to string [duplicate]如何将字节数组转换为字符串[重复]
【发布时间】:2012-07-24 04:04:34
【问题描述】:

我创建了一个包含两个字符串的字节数组。如何将字节数组转换为字符串?

var binWriter = new BinaryWriter(new MemoryStream());
binWriter.Write("value1");
binWriter.Write("value2");
binWriter.Seek(0, SeekOrigin.Begin);

byte[] result = reader.ReadBytes((int)binWriter.BaseStream.Length);

我想将result 转换为字符串。我可以使用BinaryReader,但我不能使用BinaryReader(不支持)。

【问题讨论】:

  • 你已经有了字符串,所以你实际上不能这样做——你到底在做什么
  • @harold from a «value1/2» strings 我猜这只是一个例子。
  • OP 不接受假设 UTF-8 编码的答案,但确实接受了不同的答案,这表明假设 UTF-8 编码是不安全的。
  • 你可以做new String(result)

标签: c# arrays binaryreader


【解决方案1】:

取决于您希望使用的编码:

var str = System.Text.Encoding.Default.GetString(result);

【讨论】:

  • 您还应该使用编码类将字符串写入字节数组。
  • 这实际上给出了一个有趣的结果,因为他用 BinaryWriter.Write(string) 重载编写了字符串,它首先保存了字符串的长度。
  • 另外,重要的是要知道System.Text.Encoding.Default系统当前的ANSI 代码页 - 结果会因操作系统的配置方式而异。如果你知道字符串的真正编码是什么,你应该改用那个编码。
  • 这是错误的。从问题中的代码来看,编码是UTF8,BinaryWriter的默认编码。
【解决方案2】:

假设您使用的是 UTF-8 编码:

string convert = "This is the string to be converted";

// From string to byte array
byte[] buffer = System.Text.Encoding.UTF8.GetBytes(convert);

// From byte array to string
string s = System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);

【讨论】:

  • 这个答案为读者节省了不可避免的谷歌搜索其他转换方向。
  • 这个答案更准确,因为编码规范和另一侧转换。
  • System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length);System.Text.Encoding.UTF8.GetString(buffer);相比有什么优点?
  • @WouterVanherck 从reference source 来看,不多。
  • 也为我工作BitConverter.ToString(byteArray))docs.microsoft.com/en-us/dotnet/api/…
【解决方案3】:

您可以通过使用BlockCopy 来做到这一点,而无需处理编码:

char[] chars = new char[bytes.Length / sizeof(char)];
System.Buffer.BlockCopy(bytes, 0, chars, 0, bytes.Length);
string str = new string(chars);

【讨论】:

  • 这对我不起作用。我在长度上遇到了错误(不分割给出了我需要的长度)。得到正确的长度后,我得到了一个 argumentException 试图构造字符串。
  • 这仅适用于您的字符串使用 UTF16 编码的情况,即c# string's default internal encoding scheme。如果说,字节数组是简单地用原始字符串中的 ASCII 字符编码的(假设可以),在 BlockCopy 之后,每个字符都会被两个这样的 ASCII 字符压缩,这显然是错误的。
  • 另一方面,如果您尝试创建损坏的字符串进行测试,这正是这样做的方法。谢谢!
  • 如果你只想转换成字符串然后返回,我认为你不需要担心编码,见stackoverflow.com/questions/472906/…
  • 我认为如果您在bytes.Length / sizeof(char) 上使用Math.Ceiling,那么它将始终正常工作。
【解决方案4】:

要将 byte[] 转换为 string[],只需使用以下行。

byte[] fileData; // Some byte array
//Convert byte[] to string[]
var table = (Encoding.Default.GetString(
                 fileData, 
                 0, 
                 fileData.Length - 1)).Split(new string[] { "\r\n", "\r", "\n" },
                                             StringSplitOptions.None);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 2017-03-30
    • 1970-01-01
    • 2013-05-08
    • 2015-08-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多