如何将字节数组转换为字符串

865

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

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(它不被支持)。


5
你已经有了字符串,所以你实际上不能完全按照这种方式做 - 那么你到底在做什么? - harold
2
@harold 从 "value1/2" 字符串中,我猜这只是一个例子。 - Hi-Angel
OP没有接受假定UTF-8编码的答案,但接受了另一个答案,表明假定UTF-8编码并不安全。 - Raedwald
1
你可以直接使用 new String(result) - Seraf
如果您不知道编码,可以使用using (StreamReader sr = new StreamReader(memoryStream, detectEncodingFromByteOrderMarks: true)),其中memoryStream已使用byte[]进行初始化。 - Patrick from NDepend team
4个回答

1398

根据您希望使用的编码方式:

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

32
你应该使用编码类将字符串写入字节数组。 - Servy
8
实际上这会得到一个有趣的结果,因为他使用了BinaryWriter.Write(string)方法写入字符串,该方法首先保存字符串的长度。 - harold
13
重要提示:System.Text.Encoding.Default 是系统当前的 ANSI 代码页 - 其结果将根据操作系统的配置而异。如果您知道字符串实际上采用的编码方式,应改用该编码方式。 - Wolfgang
5
这是错误的。根据问题中的代码,编码方式为UTF8,这是BinaryWriter的默认设置。 - Tom Blodget
1
如果我使用这个,它会在结果中返回钻石。而这个却可以正常工作:Convert.ToBase64String - 为什么呢? - variable
显示剩余2条评论

408

假设您正在使用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);

42
这个回答可以帮助读者避免必须进行谷歌搜索以查找另一个转换方向的情况。 - Zoomzoom
4
这个答案更准确,因为考虑到编码规范和另一侧的转换。 - pcdro
12
System.Text.Encoding.UTF8.GetString(buffer) 相比,System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length) 带来了什么优点? - Wouter Vanherck
4
根据参考来源,似乎没有太多。 - JAD
3
也为我工作 BitConverter.ToString(byteArray))。 这是一个用于将字节数组转换为十六进制字符串的 .NET 方法。具体而言,它将每个字节转换为两个十六进制字符,并用连字符分隔它们。例如,字节数组 {0xAB, 0xCD, 0xEF} 将被转换为字符串 "AB-CD-EF" - Arsen Tagaev
显示剩余2条评论

30

通过使用BlockCopy,您可以在不涉及编码的情况下完成它:

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

这对我没用。长度出错了(不分割得到我需要的长度)。在获得正确的长度后,尝试构造字符串时出现了ArgumentException。 - David Silva Smith
1
只有在使用UTF16编码的字符串上才有效,这是c#字符串默认的内部编码方案。如果字节数组仅使用原始字符串中的ASCII字符进行编码(假设可以),那么在BlockCopy之后,每个字符将被压缩为两个这样的ASCII字符,这显然是错误的。 - KFL
12
相反,如果你想创建一个用于测试的损坏字符串,这正是实现的方式。谢谢! - Nick Westgate
如果您只想将字符串转换为字节数组,然后再转回来,我认为您不需要担心编码问题,请参考https://dev59.com/mXRB5IYBdhLWcg3w6LR2。 - mcmillab
3
我认为如果你在 bytes.Length / sizeof(char) 上使用 Math.Ceiling,它将始终正常工作。 - Lukasz

12

要将 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);

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