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开发的人而言, ...
随机推荐
- 前段开发 jq ajax数据处理详细讲解。
定义和用法 ajax() 方法通过 HTTP 请求加载远程数据. 常用的ajax结构模板: function indes(){ $.ajax({ url: '', type: "GET&qu ...
- vue获取v-model数据类型boolean改变成string
问题描述 今天产品问我一线上bug,怎么radio类型改不了 问题分析 看代码,之前的哥们儿是怎么写的 //页面 <div class="ui-form-box"> & ...
- 牛客OI赛制测试赛2(0906)
牛客OI赛制测试赛2(0906) A :无序组数 题目描述 给出一个二元组(A,B) 求出无序二元组(a,b) 使得(a|A,b|B)的组数 无序意思就是(a,b)和(b,a) 算一组. 输入描述: ...
- java中list或数组中随机子集工具类
package com.example.demo.test; import java.util.ArrayList;import java.util.Arrays;import java.util.L ...
- Linux组和提权
目 录 第1章 组命名管理** 1 1.1 group组信息和密码信息 1 1.1.1 /etc/group 组账户信息 1 1.1.2 /etc/gshadow 组密码信息 ...
- [NOI2001] 炮兵阵地 (状压Dp经典例题)
如果您的电脑比较优秀能在 1sec 内跑过 2^1000 的时间复杂度,不妨你可以尝试一下,其实实际时间复杂度远远少于 2^1000,作为骗分不错的选择QAQ,然后我们来分析一下正解: 很显然此题是一 ...
- netcore使用AutoMapper
说明:以下是使用过程中看到的其他博主写的,地址如下: 地址一:https://cloud.tencent.com/developer/article/1395155 地址二:https://www.c ...
- 调试jz2440生成特定后缀的命令
生成dis命令: arm-linux-objdump -D u-boot> u-boot.dis 版权声明:本文为博主原创文章,未经博主允许不得转载.
- vs2017编译boost 1.70.0
目前最新版本的boost库是1.70.0.现在在学习使用cinatra搭建c++的http服务器,需要用到boost库中的asio,下载了一下最新版本的boost库,捣鼓了半天. 1.下载 boost ...
- _063_Android_Android内存泄露
深入内存泄露 Android应用的内存泄露,其实就是java虚拟机的堆内存泄漏. 当然,当应用有ndk,jni时,没有及时free,本地堆也会出现内存泄漏. 本文只是针对JVM内存泄漏应用,进行阐述分 ...