11

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

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

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

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

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

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

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


一些用户建议这是一个副本但我不同意。这个问题通常是关于以 url 安全的方式对字符串进行base -64 编码,但我需要重现但HttpServerUtility不依赖于System.Web.

4

2 回答 2

16

我接受了 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 的预处理输入。

于 2016-02-16T14:51:58.653 回答
3

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

通常,'+' 被替换为 '-' 和 '/' 与 '_' 填充 '=' 被删除。

此处接受的答案给出了一个代码示例:如何在 C# 中实现 Base64 URL 安全编码?

于 2016-02-16T10:53:09.737 回答