token要加编码decode吗_Base64编解码中的坑

本文主要针对.net 中的System.Web.ServerUtility.UrlTokenEncode()/UrlTokenDecode()进行解释

在巨硬的源码文档中找到4.6.2的释义:

https://referencesource.microsoft.com/#System.Web/Util/HttpEncoder.cs,0e3cb83cf51ca334

通过分析可知

1:最后一个‘=‘被编码成一个由源字符串与其长度差的加密字符.

2:‘+‘ to ‘-‘,‘/‘ to ‘_‘

相信看到这里读者都已经发现问题所在了,如果在不知道源字符串长度与最后一个补位符存在与否的情况下想解码获得源字符串是不大可能的。

那怎么办呢?自己手动写一个呗...

编码:

///

/// 字节码转为base64

/// 替换System.Web.ServerUtility.UrlTokenEncode方法

/// "/" to "_a","+" to "_b", and "=" to "_c"

///

///

///

internal static string UrlTokenEncode(byte[] input)

{

if (input == null)

throw new ArgumentNullException("input");

if (input.Length < 1)

return String.Empty;

string base64Str = null;

StringBuilder newbase64Str = new StringBuilder();

// Step 1: Do a Base64 encoding

base64Str = Convert.ToBase64String(input);

// Step 2: Copy in the other chars. Transform the "/" to "_a" ,"+" to "_b", and "=" to "_c"

foreach(var i in base64Str)

{

switch (i)

{

case ‘/‘:

newbase64Str.Append( "_a");

break;

case ‘+‘:

newbase64Str.Append( "_b");

break;

case ‘=‘:

newbase64Str.Append( "_c");

break;

default:

newbase64Str.Append(i);

break;

}

}

return newbase64Str.ToString();

}

解码:

///

/// base64解码

///

///

///

internal static byte[] UrlTokenDecode(string input)

{

if (input == null)

throw new ArgumentNullException("input");

string newInput = input.Replace("_a", "/").Replace("_b", "+").Replace("_c", "=");

int len = newInput.Length;

if (len < 1)

return new byte[0];

// Do the actual conversion

return Convert.FromBase64String(newInput);

}

不要问我为什么不把核心的编解码代码自己实现,因为懒。ok?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值