我想要对数据进行Base64编码以便将其放入URL中,并在我的HttpHandler中解码。
我发现Base64编码允许使用'/'字符,这会破坏我的UriTemplate匹配。然后我发现维基百科有一个名为"修改版Base64用于URL"的概念:
存在一种修改版Base64用于URL的变体,不会使用填充符'=‘,而是将标准Base64的'+'和'/'字符分别替换为'-'和'_',从而不再需要使用URL编码器/解码器,对编码值的长度没有影响,仍然可以在关系型数据库、Web表单和一般对象标识符中使用相同的编码形式。
使用.NET,我想修改我的当前代码,从执行基本的Base64编码和解码转为使用"修改版Base64用于URL"方法。有人做过这个吗?
对于解码部分,我知道它的开头类似于:
string base64EncodedText = base64UrlEncodedText.Replace('-', '+').Replace('_', '/');
// Append '=' char(s) if necessary - how best to do this?
// My normal base64 decoding now uses encodedText
但是,我可能需要在末尾添加一个或两个 '=' 字符,这看起来有点复杂。
我的编码逻辑应该更简单:
// Perform normal base64 encoding
byte[] encodedBytes = Encoding.UTF8.GetBytes(unencodedText);
string base64EncodedText = Convert.ToBase64String(encodedBytes);
// Apply URL variant
string base64UrlEncodedText = base64EncodedText.Replace("=", String.Empty).Replace('+', '-').Replace('/', '_');
我看到过Guid to Base64 for URL的StackOverflow帖子,但那个方法有一个已知的长度,因此他们可以在结尾处硬编码等号的数量。
UrlTokenEncode
不是严格意义上的base64url。它会将'='填充替换为'0'、'1'或'2',具体取决于替换了多少个等号。 - ladenedge