日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > C# >内容正文

C#

使用 C# 实现 URL 安全的 Base62 转码

發布時間:2023/12/4 C# 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用 C# 实现 URL 安全的 Base62 转码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

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 转码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。