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

时间:2016-02-16 10:32:54

标签: c# base64 system.web

我试图从Web API项目中删除对System.Web.dll的依赖,但偶然发现了HttpServerUtility.UrlTokenEncode(byte[] input)(及其相应的解码方法)的调用,我不会这样做。知道要替换什么以确保向后兼容性。文档说这个方法

  

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

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

  

将8位无符号整数数组转换为以64位数编码的等效字符串表示形式。

然而,它们似乎并不完全等同;当使用Convert.FromBase64String(string input)解码用HttpServerUtility编码的字符串时,我得到一个异常陈述

  

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

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

有些用户认为这是this one的副本,但我不同意。这个问题是关于以网址安全的方式一般对字符串进行base-64编码,但我需要重现HttpServerUtility确切行为但没有对System.Web的依赖。

2 个答案:

答案 0 :(得分:14)

我在他们的单词和Used Source上使用了DGibbs。事实证明,HttpServerUtility方法中发生了以下情况:

编码到Base64

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

  2. +替换为-,将/替换为_。示例:Foo+bar/===变为Foo-bar_===

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

  4. 从Base64解码

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

    2. -替换为+,将_替换为/。示例:Foo-bar_===变为Foo+bar/===

    3. 使用System.Convert解码来自Base64的预处理输入。

答案 1 :(得分:3)

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

通常,'+'替换为' - ','/'替换为'_'padding'='刚刚删除。

此处接受的答案提供了一个代码示例:How to achieve Base64 URL safe encoding in C#?