使用c#的标准方法解码Base-64字符串后的损坏

本文关键字:字符串 Base-64 损坏 方法 标准 使用 解码 | 更新日期: 2023-09-27 18:12:31

我的代码有时会出现错误,这是我无法理解的,因为这种情况会在类似的输入中产生这样的错误。

例如,在我的ASP。. NET项目我在Base64中返回一些GET结果,如:

if (currentCert == String.Empty) Response.Redirect("~/Registration.aspx?" +
 Convert.ToBase64String(Encoding.UTF8.GetBytes("error=noEcpSelected")));

所以…一种情况(只有GetBytes()方法中的最后一个字符串参数正在改变)…我得到了正常的结果,在其他我有一个关于无效字符串格式的异常(例如上部代码生成它):

输入不是一个有效的Base-64字符串,因为它包含一个非Base-64字符,两个以上的填充字符,或者填充字符之间有一个非空白字符。

当我在调试器中查看该变量时,我得到了这样一个值:

"ZXJyb3I9bm9FY3BTZWxlY3RlZA=%3d",上面的代码返回

我不明白,%3d是怎么加的?

最奇怪的是:不同字符串的代码工作方式不同,对于一个字符串-好吧,对于其他字符串-总是添加%3d或%7d…

为什么?

使用c#的标准方法解码Base-64字符串后的损坏

您不能盲目地将base-64追加到查询字符串,因为标准base-64可以包括=,它在查询字符串中具有意义。特别是,你的碱基64以==结尾——它是ZXJyb3I9bm9FY3BTZWxlY3RlZA==。所以你的查询字符串是非常混乱的-它看起来像你指定一个键-值对与关键字ZXJyb3I9bm9FY3BTZWxlY3RlZA和值=(又名%3d在url编码规则)。

至少,您必须对base-64进行url编码,或者替换不包含在查询字符串中有意义的标记的base-64字母表。我更倾向于使用显式的键值对,即... + "?t=" + urlencode(base64encode(yourdata))(在伪代码中)。

相反的显然是类似base64decode(urldecode(querystring["t"]))的东西