使用Convert.TryFromBase64String转换Guid的Base64字符串失败问题
问题分析与解决方案
问题根源
你猜测的完全正确,Convert.TryFromBase64String返回false的原因是Span初始化错误:Span<byte> bytes = new();创建的是长度为0的空Span,而Base64编码的Guid解码后固定为16字节,目标Span必须有足够容量容纳解码结果,空Span无法满足需求,因此方法返回false,字节数组为空。
正确的Span使用方式
你可以直接初始化长度为16的Span,两种常见实现方式:
- 栈分配(性能更优,适合短生命周期场景):
Span<byte> bytes = stackalloc byte[16]; - 堆分配:
Span<byte> bytes = new byte[16];
固定16字节数组的安全性
完全安全。Guid的二进制表示长度固定为16字节,对应的Base64编码(如示例中的kADs1tnSQ+2ehpdtUAK/Jg==)解码后必然得到16字节数据,因此提前分配16字节的数组或Span是可靠的,不存在容量不足或冗余问题。
修正后的代码示例
var dataString = "kADs1tnSQ+2ehpdtUAK/Jg=="; // 输出: d6ec0090-d2d9-ed43-9e86-976d5002bf26 Console.WriteLine(new Guid(Convert.FromBase64String(dataString))); // 初始化长度为16的Span Span<byte> bytes = stackalloc byte[16]; bool success = Convert.TryFromBase64String(dataString, bytes, out int _); // 输出: True,然后输出正确的Guid Console.WriteLine(success); Console.WriteLine(new Guid(bytes));
内容的提问来源于stack exchange,提问作者thibsc
相关产品推荐
相关产品推荐

