gpt4 book ai didi

c# - 这很明显,但为什么会失败呢?

转载 作者:太空狗 更新时间:2023-10-29 21:19:47 26 4
gpt4 key购买 nike

多年来一直在编写 .net 代码,但我觉得自己像个 n00b。为什么以下代码会失败?

byte[] a = Guid.NewGuid().ToByteArray(); // 16 bytes in array
string b = new UTF8Encoding().GetString(a);
byte[] c = new UTF8Encoding().GetBytes(b);
Guid d = new Guid(c); // Throws exception (32 bytes recived from c)

更新

批准了 CodeInChaos 的答案。 16 字节变成 32 字节的原因可以在他的回答中读到。答案中还指出:

the default constructor of UTF8Encoding has error checking disabled

恕我直言,UTF8 编码器在尝试将字节数组编码为包含无效字节的字符串时应该抛出异常。为了使 .net 框架正常运行,代码应该如下编写

 byte[] a = Guid.NewGuid().ToByteArray();
string b = new UTF8Encoding(false, true).GetString(a); // Throws exception as expected
byte[] c = new UTF8Encoding(false, true).GetBytes(b);
Guid d = new Guid(c);

最佳答案

并非每个字节序列都是有效的 UTF-8 编码字符串。

GUID 几乎可以包含任何字节序列。但 UTF-8 作为特定规则,如果值大于 127,则允许字节序列。 Guid 通常不会遵守这些规则。

然后,当您将损坏的字符串编码回字节数组时,您会得到一个长度超过 16 个字节的字节数组,这是 Guid 的构造函数不接受的。


关于 UTF8Encoding.GetString 的文档指出:

With error detection, an invalid sequence causes this method to throw a ArgumentException. Without error detection, invalid sequences are ignored, and no exception is thrown.

并且 UTF8Encoding 的默认构造函数禁用了错误检查(不要问我为什么)。

This constructor creates an instance that does not provide a Unicode byte order mark and does not throw an exception when an invalid encoding is detected.
Note
For security reasons, your applications are recommended to enable error detection by using the constructor that accepts a throwOnInvalidBytes parameter and setting that parameter to true.


您可能希望使用 Base64 编码而不是 UTF-8。这样您就可以将任何有效的字节序列映射到字符串中并返回。

关于c# - 这很明显,但为什么会失败呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4769682/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com