c# 自定义Base16编码解码
一、自定义Base16编码原理
Base16编码跟Base64编码原理上有点不同,当然前面转换是一样的,都是是将输入的字符串根据默认编码转换成一个字节序列,而这个字节序列里面其实就是存的ASCII码,其次,将每个ASCII码转换成8位二进制,每个八位二进制拆分成4位一组的二进制,然后将每4位一组的二进制转换成十进制, 最后,根据十进制的数字索引密文下标的字符,将这些字符串联起来就是编码的字符串。
例子:abc
ASCII码: 97 98 99
二进制: 01100001 01100010 01100011
拆分成四位一组: 0110 0001 0110 0010 0110 0011
十进制: 6 1 6 2 6 3
根据十进制索引密文下标中的字符,下面是编码的代码
/// <summary>
/// 自定义Base16编码
/// </summary>
/// <param name="str">需要编码的字符串</param>
/// <param name="autoCode">自定义Base16编码数组,16个元素,可以为数字、字符、特殊符号,若不填,使用默认的Base16编码数组,解码与编码的Base16编码数组一样</param>
/// <returns></returns>
public static string AutoBase16Encrypt(string str, string[] autoCode)
{
string innerStr = string.Empty;
StringBuilder strEn = new StringBuilder();
if (autoCode == null || autoCode.Length < )
autoCode = new string[] { "a", "", "B", "g", "E", "", "f", "", "C", "", "o", "", "Z", "p", "k", "M" };
System.Collections.ArrayList arr = new System.Collections.ArrayList(System.Text.Encoding.Default.GetBytes(str));
for (int i = ; i < arr.Count; i++)
{
byte data = (byte)arr[i];
int v1 = data >> ;
strEn.Append(autoCode[v1]);
int v2 = ((data & 0x0f) << ) >> ;
strEn.Append(autoCode[v2]);
}
return strEn.ToString();
}
二、自定义Base16解码原理
其实解码原理也很简单了,首先,将编码的字符串拆分成字符,其次,根据字符寻找到第一个和第二个字符的下标值。将第一个下标值转换成8位二进制,然后左移4位,与第二个字符的下标值合成一个字节,保存在字节数组里,最后,将保存好的字节数组根据默认编码转换成字符串。(解码我就不详加解释了)下面是解码的代码
/// <summary>
/// 自定义Base16解码
/// </summary>
/// <param name="str">需要解码的字符串</param>
/// <param name="autoCode">自定义Base16编码数组,16个元素,可以为数字、字符、特殊符号,若不填,使用默认的Base16编码数组,解码与编码的Base16编码数组一样</param>
/// <returns></returns>
public static string AutoBase16Decrypt(string str, string[] autoCode)
{
int k = ;
string dnStr = string.Empty;
int strLength = str.Length;
if (autoCode == null || autoCode.Length < )
autoCode = new string[] { "a", "", "B", "g", "E", "", "f", "", "C", "", "o", "", "Z", "p", "k", "M" };
byte[] data = new byte[strLength / ];
for (int i = , j = ; i < data.Length; i++, j++)
{
byte s = ;
int index1 = autoCode.ToList().IndexOf(str[j].ToString());
j += ;
int index2 = autoCode.ToList().IndexOf(str[j].ToString());
s = (byte)(s ^ index1);
s = (byte)(s << );
s = (byte)(s ^ index2);
data[k] = s;
k++;
}
dnStr = Encoding.Default.GetString(data);
return dnStr;
}
三、Base16编码数组解析
最后说一下这个编码数组,这个编码数组呢,是一个字符串数组,元素总数不能小于16个,当然超过16个元素,也用不上,这16个字符完全自定义,这个比较灵活,最后给大家看一个随机编码数组的函数。
/// <summary>
/// 随机编码数组
/// </summary>
/// <returns></returns>
public string[] RandomEncrypt()
{
string[] code = new string[];
Random random = new Random();
int j = ;
for (int i = ; < ; i++)
{
char ch = (char)random.Next(, );
if (code.ToList().IndexOf(ch.ToString()) < && (( ch >= '' && ch <= '')
|| (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')))
{
code[j] = ch.ToString();
j++;
}
if (!Array.Exists(code, string.IsNullOrEmpty) && code.Length == )
break;
}
return code;
}
总结:我写的这个Base16编码解码,其实很简单了,原理也很简单,适合初学者学习体验,当然这个编码解码可以扩展,如果哪位高手或者前辈有新的思路或者想法,请告知,谢谢。
c# 自定义Base16编码解码的更多相关文章
- 自定义Base16加密
自定义Base16加 ...
- Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码, 1 1.1. 子模式 urlsafe Or url ...
- Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net
Atitit. 二进制数据ascii表示法,与base64编码解码api 设计标准化总结java php c#.net 1. Base64编码,1 1.1. 子模式 urlsafe Or url u ...
- 第一百零八节,JavaScript,内置对象,Global对象字符串编码解码,Math对象数学公式
JavaScript,内置对象,Global对象字符串编码解码,Math对象数学公式 学习要点: 1.Global对象 2.Math对象 ECMA-262对内置对象的定义是:"由ECMASc ...
- 第57节:Java中流的操作以及编码解码
我的博客: https://huangguangda.cn/ https://huangguangda.github.io/ 前言: 编码解码:编码时将信息从一种形式变成为另一种形式,成为编码.编码为 ...
- 一个低级错误引发Netty编码解码中文异常
前言 最近在调研Netty的使用,在编写编码解码模块的时候遇到了一个中文字符串编码和解码异常的情况,后来发现是笔者犯了个低级错误.这里做一个小小的回顾. 错误重现 在设计Netty的自定义协议的时候, ...
- C# base 64图片编码解码
使用WinForm实现了图片base64编码解码的 效果图: 示例base 64编码字符串: /9j/4AAQSkZJRgABAQEAYABgAAD/2wBDAAgGBgcGBQgHBwcJCQgKD ...
- java中文乱码解决之道(五)-----java是如何编码解码的
在上篇博客中LZ阐述了java各个渠道转码的过程,阐述了java在运行过程中那些步骤在进行转码,在这些转码过程中如果一处出现问题就很有可能会产生乱码!下面LZ就讲述java在转码过程中是如何来进行编码 ...
- java中文乱码解决之道(六)-----javaWeb中的编码解码
在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...
随机推荐
- 初见Vue
一.What 官方定义:是一套用于构建用户界面的渐进式框架.这,what?不明觉厉,我反正现在还是不知道,在这之前,就只知道Vue.js是用来渲染数据的,其实它的核心库只关注视图层.不多说,用多了就知 ...
- Sql Server 中锁的概念(1)
Sql Server 中锁的概念 锁的概述 一. 为什么要引入锁 多个用户同时对数据库的并发操作时会带来以下数据不一致的问题: 丢失更新A,B两个用户读同一数据并进行修改,其中一个用户的修改结果破 ...
- mongdb查询数据并且返回数据条数
var totall; var a = db.db("Magiccat").collection("jishi_content").find().count({ ...
- XML 解析 & 特殊字符报错
在xml文件中,有一些符号是具有特殊意义的,如果直接使用会导致xml解析报错,为了避免错误,我们需要将特殊的字符使用其对应的转义实体进行操作.这些字符如下 < == < > = ...
- (8) tomcat中管理领域、角色及用户
srverlet Container或web应用程序本身都可以提供控制web应用程序资源的安全防护 前者称为容器管理的安全防护,或者称为应用程序管理安全防护 通过内嵌机制,tomcat提供一些安全防护 ...
- Linux vsftpd服务
vsftpd服务 由vsftpd包提供 不再由xinetd管理 用户认证配置文件:/etc/pam.d/vsftpd 服务脚本: /usr/lib/systemd/system/vsftpd.serv ...
- POJ 2485 Highways (求最小生成树中最大的边)
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- C++实现顺序栈类求解中缀表达式的计算
控制台第一行打印的数值为使用形如以下方式得到的结果: cout << +*(+)*/- << endl; 即第一个待求解表达式由C++表达式计算所得结果,以用于与实现得出的结果 ...
- mac 终端path配置出错,命令无法使用
mac 命令行中修改path的时候,不小心把path修改错了,而且还 source 了,然后发现只能使用 cd 命令,ls vi 命令都不能使用了. 解决办法,执行下面的语句 export PATH= ...
- 一份快速实用的 tcpdump 命令参考手册
对于 tcpdump 的使用,大部分管理员会分成两类.有一类管理员,他们熟知 tcpdump 和其中的所有标记:另一类管理员,他们仅了解基本的使用方法,剩下事情都要借助参考手册才能完成.出现这种情况 ...