我想在C#中实现Base64 URL安全编码 . 在Java中,我们有一个通用的 Codec
库,它为我提供了一个URL安全编码字符串 . 如何使用C#实现相同的目标?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
上面的代码将它转换为Base64,但它填充 ==
. 有没有办法实现URL安全编码?
7 回答
使用System.Web.HttpServerUtility.UrlTokenEncode(bytes)进行编码,并使用System.Web.HttpServerUtility.UrlTokenDecode(bytes)进行解码 .
通常只需交换字母表以便在网址中使用,这样就不需要%编码; 65个字符中只有3个有问题 -
+
,/
和=
. 最常见的替代品是-
代替+
和_
代替/
. 至于填充:只需删除它(=
);你可以推断出所需的填充量 . 在另一端:只需逆转过程:有:
并扭转:
然而,有趣的问题是:这与"common codec library"使用的方法相同吗?测试肯定是合理的第一件事 - 这是一种非常常见的方法 .
您可以使用命名空间
Microsoft.IdentityModel.Tokens
中的类Base64UrlEncoder
.基于这里的答案和一些性能改进,我们发布了一个非常容易使用的url-safe base64 implementation to NuGet源代码available on GitHub(MIT许可) .
用法很简单
如果您使用的是ASP.NET Core,则另一个选项是使用Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode .
如果您不使用ASP.NET Core,the WebEncoders source可在Apache 2.0 License下找到 .
这是解码url-safe base64的另一种方法,用与Marc相同的方式进行编码 . 我只是不明白为什么
4-length%4
工作(确实如此) .如下所示,只有原点的位长是6和8的公倍数,base64不会在结果中附加“=” .
所以我们可以相反地做,如果结果的位长度不能被8整除,则附加:
在UWP中使用Microsoft加密引擎 .