ChatGPT解决这个技术问题 Extra ChatGPT

如何将字节数组转换为字符串[重复]

这个问题在这里已经有了答案:How to convert UTF-8 byte[] to string (16 answers) 8年前关闭。

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

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 来自 «value1/2» 字符串我想这只是一个例子。
OP 不接受假设 UTF-8 编码的答案,但确实接受了不同的答案,这表明假设 UTF-8 编码是不安全的。
你可以做new String(result)

e
eulerfx

根据您希望使用的编码:

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

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

假设您使用的是 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); 相比,System.Text.Encoding.UTF8.GetString(buffer, 0, buffer.Length); 有什么优点?
@WouterVanherck 从 reference source 来看,不多。
也为我工作BitConverter.ToString(byteArray)) docs.microsoft.com/en-us/dotnet/api/…
P
Peter Mortensen

您可以使用 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,那么它将始终正常工作。
P
Peter Mortensen

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