Convert.ToBase64String(byte [])和HttpServerUtility.UrlTokenEncode(byte [])有什么区别?

Tom*_*han 10 c# base64 system.web

我试图消除对System.Web.dllWeb API项目的依赖,但偶然发现了一个调用HttpServerUtility.UrlTokenEncode(byte[] input)(和它相应的解码方法),我不知道要替换什么以确保向后兼容性.文档说这个方法

使用64位数字将字节数组编码为等效的字符串表示,可用于在URL上传输.

我尝试用Convert.ToBase64String(byte[] input)(及其相应的解码方法)代替,这在文档中非常类似地描述:

将一个8位无符号整数数组转换为其等效的字符串表示形式,该表示形式使用base-64数字进行编码.

但是,它们似乎并不完全等同; 当Convert.FromBase64String(string input)用于解码用其编码的字符串时HttpServerUtility,我得到一个异常说明

输入不是有效的Base-64字符串,因为它包含非基本64个字符,两个以上的填充字符或填充字符中的非法字符.

这两个转换实用程序有什么区别?消除这种依赖的正确方法是System.Web.HttpServerUtility什么?


有些用户建议这与此相关,但我不同意.这个问题是关于编码基64字符串的URL安全的方式一般,但我需要重现具体行为HttpServerUtility,但没有一个依赖System.Web.

Tom*_*han 14

我接受了DGibbs的话,并使用Source.事实证明,HttpServerUtility方法中发生以下情况:

编码到Base64

  1. 使用System.Convert的输入转换为Base64.

  2. 更换+-/通过_.示例:Foo+bar/===变成Foo-bar_===.

  3. 替换=字符串末尾的任意数字,用一个整数表示它们的数量.示例:Foo-bar_===变成Foo-bar_3.

从Base64解码

  1. 将字符串末尾的数字替换为相同数量的=符号.示例:Foo-bar_3变成Foo-bar_===.

  2. 更换-+_通过/.示例:Foo-bar_===变成Foo+bar/===.

  3. 使用System.Convert从Base64编码预处理的输入进行解码.

  • 还应注意,末尾的数字是必需的 - 即没有 `=` 符号会将 `0` 附加到输出/从输入解释。 (2认同)

Max*_*axJ 4

HttpServerUtility.UrlTokenEncode(byte[] input)将编码 URL 安全 Base64 字符串。在 Base64 中 +、/ 和 = 字符是有效的,但它们不是 URL 安全的,此方法将替换这些字符,而 则Convert.ToBase64String(byte[] input)不会。您也许可以放弃参考并自己完成。

通常,“+”被替换为“-”,“/”被“_”替换,填充“=”被删除。

这里接受的答案给出了一个代码示例:How to Achieve Base64 URL safeencoding in C#?

  • 这其实并不完全正确。填充“=”不会被“删除”,而是被“替换为表示其计数的整数”。换句话说,`blah==` 变成了 `blah2`,而不是 `blah`。(通过查看源代码发现了这一点)。 (5认同)