Base62 编码与 Base64 编码类似,都用于数据内容编码。Base64 和 Base62 的目的在都在于将需要传输的内容进行编码,尤其是一些特殊字符(如不可见字符、传输时与协议头冲突的字符)。

与 Base64 不同的是,Base62 编码是由10个数字、26个大写英文字母和26个小写英文字母组成,不包含 Base64 中的符号:+,/和=。这让经过 Base62 编码的数据很适合在 URL 中进行传输。

微信的扫码登录规定了 state 只能使用 a-zA-Z0-9 的参数值,这种场景下使用 Base62 就很有效。

public static class Base62
{private const string DefaultCharacterSet = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";private const string InvertedCharacterSet = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";/// <summary>/// Encode a byte array with Base62/// </summary>/// <param name="original">Byte array</param>/// <param name="inverted">Use inverted character set</param>/// <returns>Base62 string</returns>public static string ToBase62(byte[] original, bool inverted = false){var characterSet = inverted ? InvertedCharacterSet : DefaultCharacterSet;var arr = Array.ConvertAll(original, t => (int)t);var converted = BaseConvert(arr, 256, 62);var builder = new StringBuilder();foreach (var t in converted){builder.Append(characterSet[t]);}return builder.ToString();}/// <summary>/// Decode a base62-encoded string/// </summary>/// <param name="base62">Base62 string</param>/// <param name="inverted">Use inverted character set</param>/// <returns>Byte array</returns>public static byte[] FromBase62(string base62, bool inverted = false){if (string.IsNullOrWhiteSpace(base62)){throw new ArgumentNullException(nameof(base62));}var characterSet = inverted ? InvertedCharacterSet : DefaultCharacterSet;var arr = Array.ConvertAll(base62.ToCharArray(), characterSet.IndexOf);var converted = BaseConvert(arr, 62, 256);return Array.ConvertAll(converted, Convert.ToByte);}private static int[] BaseConvert(int[] source, int sourceBase, int targetBase){var result = new List<int>();var leadingZeroCount = Math.Min(source.TakeWhile(x => x == 0).Count(), source.Length - 1);int count;while ((count = source.Length) > 0){var quotient = new List<int>();var remainder = 0;for (var i = 0; i != count; i++){var accumulator = source[i] + remainder * sourceBase;var digit = accumulator / targetBase;remainder = accumulator % targetBase;if (quotient.Count > 0 || digit > 0){quotient.Add(digit);}}result.Insert(0, remainder);source = quotient.ToArray();}result.InsertRange(0, Enumerable.Repeat(0, leadingZeroCount));return result.ToArray();}
}

将字节数组转换为 Base62 字符串

var guid = Guid.Parse("40943a11e5434d2f869d4e566e48c4f2");
Console.WriteLine(Base62.ToBase62(guid.ToByteArray()));

输出:

WVdhFoDbSqBBYSKzptnko

将 Base62 字符串转换为字节数组

var str = "WVdhFoDbSqBBYSKzptnko";
var bytes = Base62.FromBase62(str);
var guid = new Guid(bytes);
Console.WriteLine(guid.ToString("N"));

输出:

40943a11e5434d2f869d4e566e48c4f2

使用 C# 实现 URL 安全的 Base62 转码相关推荐

  1. 根据url动态生成二维码

    根据url动态生成二维码的工具类,没有细研究,先贴出来,有兴趣自己深究.public class QRCodeUtil {public static BufferedImage createImage ...

  2. 根据url地址生成二维码,微信扫描二维码可直接打开网址

    需求:根据url地址生成二维码,微信扫描二维码可直接打开网址 html代码: <input id="text" type="text" value=&qu ...

  3. 解析网络URL地址的二维码

    java解析url二维码 解析网络URL地址的二维码 解析网络URL地址的二维码 @Testvoid contextLoads() throws Exception {StringBuffer sb ...

  4. HTML简洁大气带进度条的URL跳转页面源码

    正文: HML简洁大气带进度条的URL跳转页面源码,这程序没什么多介绍的,主要是可用于网站内链接跳转,或者广告链接跳转啥的,UI非常的美观好看. 程序: lanzou.com/iONLE0511hsd ...

  5. decode函数吗 jsp_JSP中js传递和解析URL参数以及中文转码和解码问题

    1.传递参数: var pmt = 'sensor='+ encodeURI(encodeURI(sensor))+'&device='+encodeURI(encodeURI(device) ...

  6. 网络爬虫之Url含有中文如何转码

    在搞爬虫时,有时会遇到url中含有中文字符,请求会出错,那么就需要对含有中文的url进行转码. 以下,以科学网为例,如下图所示: 可以看到,url中含有中文,如下写了一个样例程序,将url中对应的中文 ...

  7. 【Vue】Vue生成二维码 Vue把url地址生成二维码手机打开 扫一扫手机端打开实战案例 vue生成二维码

    代码 npm install qrcodejs2 --save 代码引入到项目中,不需要再main.js做处理,只需要在使用的vue页面中引入. 在页面中使用 <template>< ...

  8. 2022-5月如何使用疯狂URL获取抖音推流码地址(抖音无人直播教程)

    什么是推流地址? 平时我们如果是下载直播,叫拉流.但如果是你自己要直播,属于上传直播流数据,叫推流,即:把直播流数据推送到视频服务器,然后别人才能看到直播画面 推流地址有什么用? 有了推流地址,我们就 ...

  9. java URL中含有汉字转码格式

    传入url即可实现public static String toUtf8String(String s) {StringBuffer sb = new StringBuffer();for (int ...

最新文章

  1. 在Red Hat Linux中自动运行程序
  2. 我爱我家 CIO 刘东颖:如何靠六大维度提升“数字化”能力?|鲸犀峰会
  3. 技术人的生命之源在于绝不固步自封而不断进取的精神
  4. SAP Spartacus angular.json 中定义的 serve-ssr
  5. linux卸载android studio,mac上完整卸载删除.简单粗暴无脑:androidstudio删除方案
  6. hdu 4612 边连通度缩点+树的最长路径
  7. 东芝笔记本linux系统安装驱动,笔记本驱动,详细教您东芝笔记本无线网卡驱动怎么安装...
  8. 2021年北京交通大学925数据结构考研真题回忆版
  9. 清华大学王媛老师的讲座
  10. Maven实战. 3.7NetBeans Maven插件简单使用
  11. JAVA实现图的邻接表以及DFS
  12. 电子邮件系统是如何运作的?
  13. 华为手机能隐藏蓝牙吗_华为手机的11个隐藏功能
  14. 【word毕业论文排版(3)】word导出带有书签的PDF失败,转为用WPS成功
  15. node.js(四 --- 全局对象)
  16. 2015年11月27日 野外生存(一)刀
  17. asp.net动态网页制作视频教程
  18. 移动app测试经验分享
  19. GB28181协议常见几种信令流程(二)
  20. 深度学习之格式转换笔记(三):keras(.hdf5)模型转TensorFlow(.pb) 转TensorRT(.uff)格式

热门文章

  1. 线程池的开源实现(mariadb和percona版本)
  2. 33条C#、.Net经典面试题目及答案[zt]
  3. 我们是如何通过全球第一免费开源ERP Odoo做到项目100%交付
  4. 06 小数据池 is 和 = = 再谈编码
  5. pullToRefresh下拉刷新上拉加载
  6. UI设计师应了解最终用户的十件事
  7. SQL Azure Reporting CTP
  8. 浏览器要是能这么做就好了
  9. 一个不错的游戏 - flash webgame
  10. 荣耀9igoogle模式_iGoogle个性化主页的6种替代方法