C# Convert.ToBase64String(字节[])和HttpServerUtility.UrlTokenEncode(字节[])之间有什么区别?

C# Convert.ToBase64String(字节[])和HttpServerUtility.UrlTokenEncode(字节[])之间有什么区别?,c#,base64,system.web,C#,Base64,System.web,我正试图从一个Web API项目中消除对System.Web.dll的依赖,但无意中发现了一个调用(及其相应的解码方法),我不知道用什么替换它以确保向后兼容性。文件上说这种方法 使用基本64位数字将字节数组编码为其等效的字符串表示形式,可用于在URL上传输 我试着用替换(及其相应的解码方法),这与文档中的描述非常相似: 将由8位无符号整数组成的数组转换为其等效的字符串表示形式,该表示形式使用以64位为基数的数字进行编码 然而,它们似乎并不完全相同;当使用Convert.FromBase64Str

我正试图从一个Web API项目中消除对
System.Web.dll
的依赖,但无意中发现了一个调用(及其相应的解码方法),我不知道用什么替换它以确保向后兼容性。文件上说这种方法

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

我试着用替换(及其相应的解码方法),这与文档中的描述非常相似:

将由8位无符号整数组成的数组转换为其等效的字符串表示形式,该表示形式使用以64位为基数的数字进行编码

然而,它们似乎并不完全相同;当使用
Convert.FromBase64String(字符串输入)
对使用
HttpServerUtility
编码的字符串进行解码时,我得到一个异常

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

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



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

HttpServerUtility.urltokencode(byte[]input)
将对url安全的Base64字符串进行编码。在Base64+中,/和=字符有效,但它们不是URL安全的,此方法将替换这些字符,而
Convert.ToBase64String(byte[]input)
将不替换这些字符。你也许可以删除引用,自己做

通常,“+”被替换为“-”,而“/”被替换为“u”padding“=”则被删除


这里接受的答案给出了一个代码示例:

我用DGIBB的单词和。在
HttpServerUtility
方法中会发生以下情况:

编码到Base64
  • 使用
    System.Convert
    将输入转换为Base64

  • +
    替换为
    -
    /
    替换为
    .
    。示例:
    Foo+bar/==
    变成
    Foo-bar

  • 将字符串末尾的任意数量的
    =
    替换为一个整数,表示它们的数量。示例:
    Foo-bar==
    变成
    Foo-bar\u3

  • 从Base64解码
  • 用相同数量的
    =
    符号替换字符串末尾的数字。示例:
    Foo-bar\u 3
    变为
    Foo-bar\u==

  • +
    替换
    -
    ,用
    /
    替换
    。示例:
    Foo-bar==
    变成
    Foo+bar/==

  • 使用
    System.Convert
    对来自Base64的预处理输入进行解码


  • 你可以看一看,可能会有一些启发。可能的重复事实上并不完全正确。填充
    =
    不会被删除,而是被一个表示计数的整数替换。换句话说,
    blah==
    变成
    blah2
    ,而不是
    blah
    。(通过查看源代码发现了这一点)。还应注意,末尾的数字是必需的,即无
    =
    符号将
    0
    附加到输出/从输入解释。