解码有效的base64字符串时,输入不是有效的基本-64字符串

发布于 2025-01-24 16:32:11 字数 714 浏览 5 评论 0原文

尽管输入字符串是有效的base64字符串,但下面代码会引发一个构造Xpection。

为什么?

system.formateXception输入不是有效的基本-64字符串,因为它包含一个非基本64个字符,超过两个填充字符或填充字符中的非法字符。

string expectedString = "this";
byte[] expectedBytes = Encoding.Unicode.GetBytes(expectedString);
string base64String = Convert.ToBase64String(expectedBytes);
var input = new MemoryStream(Encoding.Unicode.GetBytes(base64String));
using FromBase64Transform myTransform = new FromBase64Transform();
using CryptoStream cryptoStream = new CryptoStream(input, myTransform, CryptoStreamMode.Read);

using var sr = new StreamReader(cryptoStream);
string str = await sr.ReadToEndAsync(); // Throws 
    
Assert.Equal(expectedString, str);

The below code throws a FormatException, although the input string is a valid base64 string.

Why?

System.FormatException The input is not a valid Base-64 string as it contains a non-base 64 character, more than two padding characters, or an illegal character among the padding characters.

string expectedString = "this";
byte[] expectedBytes = Encoding.Unicode.GetBytes(expectedString);
string base64String = Convert.ToBase64String(expectedBytes);
var input = new MemoryStream(Encoding.Unicode.GetBytes(base64String));
using FromBase64Transform myTransform = new FromBase64Transform();
using CryptoStream cryptoStream = new CryptoStream(input, myTransform, CryptoStreamMode.Read);

using var sr = new StreamReader(cryptoStream);
string str = await sr.ReadToEndAsync(); // Throws 
    
Assert.Equal(expectedString, str);

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

乙白 2025-01-31 16:32:11

正如马丁所建议的那样,用UTF8作品代替。

因此,FromBase64Transform或CryptoStream只能支持UTF8

工作代码:

string expectedString = "this is a test";
byte[] expectedBytes = Encoding.Unicode.GetBytes(expectedString);
string base64String = Convert.ToBase64String(expectedBytes);
var input = new MemoryStream(Encoding.UTF8.GetBytes(base64String));
using FromBase64Transform myTransform = new FromBase64Transform();
using CryptoStream cryptoStream = new CryptoStream(input, myTransform, CryptoStreamMode.Read);

using var sr = new StreamReader(cryptoStream);
string str = await sr.ReadToEndAsync(); // OK

// Note: str != expectedString 'literally' because base64String is UTF-16 and we've used Encoding.UTF8 to get the bytes from it.

谢谢!

As suggested by Martin, replacing with UTF8 works.

So FromBase64Transform or CryptoStream may only support UTF8

Working code:

string expectedString = "this is a test";
byte[] expectedBytes = Encoding.Unicode.GetBytes(expectedString);
string base64String = Convert.ToBase64String(expectedBytes);
var input = new MemoryStream(Encoding.UTF8.GetBytes(base64String));
using FromBase64Transform myTransform = new FromBase64Transform();
using CryptoStream cryptoStream = new CryptoStream(input, myTransform, CryptoStreamMode.Read);

using var sr = new StreamReader(cryptoStream);
string str = await sr.ReadToEndAsync(); // OK

// Note: str != expectedString 'literally' because base64String is UTF-16 and we've used Encoding.UTF8 to get the bytes from it.

Thanks!

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文