You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

160 lines
4.5 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Newtonsoft.Json;
namespace Myshipping.Core;
public static class Base64Util
{
// 随机字符长度
public const int RandomPrefixStrLength = 6;
public const string RandomStr = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
private static string GetRandomStr(string randomStr = RandomStr, int randomPrefixStrLength = RandomPrefixStrLength)
{
// ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
var result = "";
var random = new Random(Convert.ToInt32($"{DateTime.Now:HHmmssfff}"));
for (var i = 0; i < randomPrefixStrLength; i++)
{
var randomInt = random.Next(0, randomStr.Length);
var randomChar = randomStr[randomInt];
result += randomChar;
}
Thread.Sleep(1); // 休眠,以使随机数不重叠.
return result;
}
static readonly Encoding encoding = Encoding.UTF8;
/// <summary>
/// 普通 字符串 转换为 base64 字符串
/// </summary>
public static string ToBase64(this string str, int randomPrefixStrLength = RandomPrefixStrLength)
{
if (string.IsNullOrWhiteSpace(str))
{
return "";
}
try
{
var randomPrefixStr = GetRandomStr(RandomStr, randomPrefixStrLength);
var buffer = encoding.GetBytes(str);
var base64Str = Convert.ToBase64String(buffer);
base64Str = randomPrefixStrLength == 0 ? base64Str : InsertRandomStrToBase64Str(base64Str);
return $"{randomPrefixStr}{base64Str}";
}
catch (Exception ex)
{
Console.WriteLine($"Base64Utility.ToBase64: {ex}");
}
return string.Empty;
}
/// <summary>
/// base64 字符串 转换为 普通 字符串
/// </summary>
public static string Base64ToString(this string base64Str, int randomPrefixStrLength = RandomPrefixStrLength)
{
var result = base64Str.Trim();
try
{
if (string.IsNullOrWhiteSpace(base64Str?.Trim()))
{
return "";
}
base64Str = base64Str?.Trim();
var input = base64Str?.Substring(randomPrefixStrLength);
input = randomPrefixStrLength == 0 ? input : RemoveBase64StrRandomStr(input);
var buffer = Convert.FromBase64String(input);
result = encoding.GetString(buffer);
}
catch (Exception ex)
{
Console.WriteLine($"Base64Utility.Base64ToString: {ex}");
}
return result;
}
public struct PwdDic
{
[JsonProperty("version")]
public string Version { get; set; }
[JsonProperty("item")]
public List<PwdDicItem> Item { get; set; }
}
public struct PwdDicItem
{
[JsonProperty("index")]
public int Index { get; set; }
[JsonProperty("randomIndex")]
public int RandomIndex { get; set; }
}
public static readonly PwdDic dic = new PwdDic
{
Version = "3",
Item = new List<PwdDicItem>
{
// 100 以内字典
new() {Index = 99, RandomIndex = 91},
new() {Index = 77, RandomIndex = 66},
new() {Index = 45, RandomIndex = 37},
new() {Index = 22, RandomIndex = 12},
new() {Index = 5, RandomIndex = 3}
// 这里的 RandomIndex 要比 Index 小而且Index 和 RandomIndex 所有的Value都是唯一的不能重复。
// 由于这里开源,所以这个字典需要自行定义。
}
};
private static string InsertRandomStrToBase64Str(string base64Str)
{
var strResult = $"{base64Str}";
dic.Item.ForEach(item =>
{
if (item.Index < base64Str.Length)
{
var randomChar = base64Str[item.RandomIndex];
strResult = strResult.Insert(item.Index, $"{randomChar}");
}
});
return strResult;
}
private static string RemoveBase64StrRandomStr(string input)
{
var items = dic.Item.OrderBy(x => x.Index).ToList();
var strResult = $"{input}";
items.ForEach(item =>
{
if (item.Index < strResult.Length)
{
strResult = strResult.Remove(item.Index, 1);
}
});
return strResult;
}
}