Convert.ToBase64String(byte[]) 和 HttpServerUtility.UrlTokenE
本文关键字:HttpServerUtility UrlTokenE ToBase64String byte Convert | 更新日期: 2023-09-27 18:34:51
我正在尝试从 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
.
我把DGibbs的话放在他们的话上,并使用了源代码。事实证明,HttpServerUtility
方法中会发生以下情况:
编码为 Base64
-
使用
System.Convert
将输入转换为 Base64。 -
将
+
替换为-
,/
替换为_
。示例:Foo+bar/===
变为Foo-bar_===
。 -
将字符串末尾的任意数量的
=
替换为表示它们有多少个的整数。示例:Foo-bar_===
变为Foo-bar_3
。
从 Base64 解码
-
将字符串末尾的数字替换为相同数量的
=
符号。示例:Foo-bar_3
变为Foo-bar_===
。 -
将
-
替换为+
,_
替换为/
。示例:Foo-bar_===
变为Foo+bar/===
。 -
使用
System.Convert
解码来自 Base64 的预处理输入。
HttpServerUtility.UrlTokenEncode(byte[] input)
将编码一个URL安全的Base64字符串。在 Base64 + 中,/和 = 字符有效,但它们不是 URL 安全的,此方法将替换这些字符,而Convert.ToBase64String(byte[] input)
不会。您可以删除引用并自己执行。
-",而"/"被替换为"_"填充"="只是被删除。
这里接受的答案给出了一个代码示例:如何在 C# 中实现 Base64 URL 安全编码?