You can not 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.4 KiB

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using Newtonsoft.Json;
namespace GDZZ.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;
}
}