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开发的人而言, ...
随机推荐
- Proguard配置文件内容
-injars elec-bendao-1.2.jar-outjars elec-bendao-1.2-end.jar -libraryjars lib\charsets.jar-libraryjar ...
- DNS查询过程
DNS查询过程 假设www.abc.com的主机要查询www.xyz.abc.com的服务器ip地址. 知识点 1.hosts文件:以静态映射的方式提供IP地址与主机名的对照表,类似ARP表 2.域: ...
- Java编程:常见问题汇总
每天在写Java程序,其实里面有一些细节大家可能没怎么注意,这不,有人总结了一个我们编程中常见的问题.虽然一般没有什么大问题,但是最好别这样做. AD: 每天在写Java程序,其实里面有一些细节大家可 ...
- Swift 中的Range和NSRange不同
Swift中的Ranges和Objective-C中的NSRange有很大的不同,我发现在处理Swift中Ranges相关的问题的时候,总是要花费比我想象的更多的时间.不过,现在回过头来看看,发现Sw ...
- CF528D Fuzzy Search 字符串匹配+FFT
题意: DNA序列,在母串s中匹配模式串t,对于s中每个位置i,只要s[i-k]到s[i+k]中有c就认为匹配了c.求有多少个位置匹配了t. 分析: 这个字符串匹配的方式,什么kmp,各种自动机都不灵 ...
- 4. COLLATION_CHARACTER_SET_APPLICABILITY
4. COLLATION_CHARACTER_SET_APPLICABILITY 表COLLATION_CHARACTER_SET_APPLICABILITY表示哪种字符集适用于哪种排序规则. INF ...
- Beego:原生方式使用MySQL
示例: package controllers import ( "database/sql" "fmt" "github.com/astaxie/b ...
- 第一次:从今开始玩Linux,Ubuntu16.04
首先声明,我的文章不配图,就靠文字描述,然后自己体会,摸着石头体验吧! 从今天开始玩Linux,Ubuntu16.04据说是比较稳定的,界面友好,类似与Windows界面,也有Linux的命令终端,用 ...
- 条款18:让接口容易被正确使用,不易被误用(Make interface easy to use correctly and hard to use incorrectly)
NOTE : 1.好的接口容易被正确使用,不容易被误用.应该让所有接口努力达成这些性质. 2.“促进正确使用”的办法包括接口的一致性,以及内置类型的行为兼容. 3.“阻止误用”的办法包括建立新类型/限 ...
- Mybatis中实体类属性和数据列之间映射的四种办法
http://blog.csdn.net/lmy86263/article/details/53150091 Mybatis不像hibernate中那么自动化,通过@Column注解或者直接使用实体类 ...