Vis*_*nis 88 c# base64 encoding
我想在C#中实现Base64 URL安全编码.在Java中,我们有一个公共Codec库,它为我提供了一个URL安全编码字符串.如何使用C#实现相同的目标?
byte[] toEncodeAsBytes = System.Text.ASCIIEncoding.ASCII.GetBytes("StringToEncode");
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes);
Run Code Online (Sandbox Code Playgroud)
上面的代码将它转换为Base64,但它填充==.有没有办法实现URL安全编码?
Mar*_*ell 159
通常只需交换字母表以便在网址中使用,这样就不需要%编码; 只有65个字符的3是有问题- +,/和=.最常见的替代品-代替+和_替代/.至于填充:只需删除它(=); 你可以推断出所需的填充量.在另一端:只需逆转过程:
string returnValue = System.Convert.ToBase64String(toEncodeAsBytes)
.TrimEnd(padding).Replace('+', '-').Replace('/', '_');
Run Code Online (Sandbox Code Playgroud)
有:
static readonly char[] padding = { '=' };
Run Code Online (Sandbox Code Playgroud)
并扭转:
string incoming = returnValue
.Replace('_', '/').Replace('-', '+');
switch(returnValue.Length % 4) {
case 2: incoming += "=="; break;
case 3: incoming += "="; break;
}
byte[] bytes = Convert.FromBase64String(incoming);
string originalText = Encoding.ASCII.GetString(bytes);
Run Code Online (Sandbox Code Playgroud)
然而,有趣的问题是:这与"通用编解码器库"使用的方法相同吗?测试肯定是合理的第一件事 - 这是一种非常常见的方法.
Jer*_*ome 69
您可以使用Base64UrlEncoder命名空间中的类Microsoft.IdentityModel.Tokens.
const string StringToEncode = "He=llo+Wo/rld";
var encodedStr = Base64UrlEncoder.Encode(StringToEncode);
var decodedStr = Base64UrlEncoder.Decode(encodedStr);
if (decodedStr == StringToEncode)
Console.WriteLine("It works!");
else
Console.WriteLine("Dangit!");
Run Code Online (Sandbox Code Playgroud)
Kev*_*oid 10
如果您使用的是ASP.NET Core,则另一种选择是使用Microsoft.AspNetCore.WebUtilities.WebEncoders.Base64UrlEncode。
如果您未使用ASP.NET Core,则该WebEncoders源可在Apache 2.0 License下获得。
使用System.Web.HttpServerUtility.UrlTokenEncode(bytes)进行编码,并使用System.Web.HttpServerUtility.UrlTokenDecode(bytes)进行解码.
基于在这里下车了一些性能改进问题的答案,我们发表了一篇非常好用网址安全base64实施的NuGet的源代码在GitHub上可用的(MIT许可).
用法很简单
var bytes = Encoding.UTF8.GetBytes("Foo");
var encoded = UrlBase64.Encode(bytes);
var decoded = UrlBase64.Decode(encoded);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
70628 次 |
| 最近记录: |