关于BASE 24 ,BASE 64原理以及实现程序
关于BASE 24 ,BASE 64原理以及实现程序
来源 https://wangye.org/blog/archives/5/
可能很多人听说过Base64编码,很少有人听说过Base24编码,Base24编码主要应用在序列号生成上,其实基本的算法思想都是一样的,只是编码的模式有点变化。
Base64所对应的编码表是
ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=
共计64位。
而Base24所对应的编码表是
BCDFGHJKMPQRTVWXY2346789
共计24位,这里主要去掉了一些对于序列号来说不容易识别和容易混淆的字符。
具体算法网上都有介绍我就不再赘述,下面直接谈怎么编码实现吧:-)
对于Base64算法的C语言实现,大家可以参考Bob Trower的经典开源项目b64.c,网址是http://base64.sourceforge.net/。
在这里我要谈的是如何用ASP进行Base64编码,网上搜索出的一大堆算法不是太复杂就是运行不准确,其实ASP的Base64编码可以很简单,当然要用到服务器的一个COM组件XmlDom,具体思路是这样的,首先创建个临时的节点tmp,然后给结点tmp,设置datatype = “bin.base64″,这样就可以进行相应的编解码了,对于文本字符串的编解码还要用ADODB.Stream进行一次编码转换。
Base64的ASP实现:
- Class CBase64
- Private objXmlDom
- Private objXmlNode
- ' GetObjectParam() 这个函数实现参考了开源项目PJBlog
- Private Function GetObjectParam()
- On Error Resume Next
- Dim Temp
- GetObjectParam = "Microsoft.XMLDOM"
- Err =
- Dim TmpObj
- Set TmpObj = Server.CreateObject(GetObjectParam)
- Temp = Err.Number
- If Temp = Or Temp = - Then
- GetObjectParam = "Msxml2.DOMDocument.5.0"
- End If
- Err.Clear
- Set TmpObj = Nothing
- Err =
- End Function
- Private Sub Class_Initialize()
- Set objXmlDom = Server.CreateObject(GetObjectParam())
- End Sub
- Private Sub Class_Terminate()
- Set objXmlDom = Nothing
- End Sub
- Public Function encode(AnsiCode)
- encode = ""
- Set objXmlNode = objXmlDom.createElement("tmp")
- objXmlNode.datatype = "bin.base64"
- objXmlNode.nodeTypedvalue = AnsiCode
- encode = objXmlNode.Text
- Set objXmlNode = Nothing
- End Function
- Public Function decode(base64Code)
- On Error Resume Next
- decode = ""
- Set objXmlNode = objXmlDom.createElement("tmp")
- objXmlNode.datatype = "bin.base64"
- objXmlNode.Text = base64Code
- decode = objXmlNode.nodeTypedvalue
- Set objXmlNode = Nothing
- If Err Then
- Err.Clear
- End If
- End Function
- ' 以下函数编码字符串
- Public Function encodeText(ByVal str)
- On Error Resume Next
- Dim ado, r: r = ""
- If str <> "" Then
- Set ado = Server.CreateObject("ADODB.Stream")
- With ado
- .Charset = "gb2312"
- .Type =
- If .State = Then .Open
- .WriteText str
- .Position =
- .Type =
- r = encode(.Read(-))
- .Close
- End With
- Set ado = Nothing
- End If
- If Err Then Err.Clear: r = ""
- encodeText = r
- End Function
- ' 以下函数解码字符串
- Public Function decodeText(ByVal str)
- On Error Resume Next
- Dim ado, r: r = ""
- If str <> "" Then
- Set ado = Server.CreateObject("ADODB.Stream")
- With ado
- .Charset = "gb2312"
- .Type =
- If .State = Then .Open
- .Write (decode(str))
- .Position =
- .Type =
- r = .ReadText(-)
- .Close
- End With
- Set ado = Nothing
- End If
- If Err Then Err.Clear: r = ""
- decodeText = r
- End Function
- End Class
写到这里想起以前项目里改写过一段Base64和16进制互转的代码,在这里与大家分享下。
- ' Base64转16进制
- Function B64ToHex(ByVal strContent)
- Dim i,strReturned, b64pad, _
- b64map, chTemp, intLocate, k , slop
- strReturned = "" : k =
- b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_
- "abcdefghijklmnopqrstuvwxyz0123456789+/"
- b64pad="="
- For i= To Len(strContent)-
- chTemp = Mid(strContent, i+, )
- If chTemp = b64pad Then Exit For
- intLocate = InStr(, b64map, chTemp, )-
- If intLocate > - Then
- Select Case K
- Case
- strReturned = strReturned &_
- Int2Char(Int(intLocate / ))
- slop = intLocate And : k =
- Case
- strReturned = strReturned &_
- Int2Char( (slop * ) Or (Int(intLocate / )) )
- slop = intLocate And &h0f : k =
- Case
- strReturned = strReturned &_
- Int2Char(slop) & Int2Char(Int(intLocate / ))
- slop = intLocate And : k=
- Case Else
- strReturned = strReturned &_
- Int2Char( (slop * ) Or (Int(intLocate / )) ) &_
- Int2Char(intLocate And &h0f)
- k =
- End Select
- End If
- Next
- If k= Then strReturned = strReturned & Int2Char(slop * )
- B64ToHex = strReturned
- End Function
- ' 16进制转Base64
- Function HexToB64(ByVal strContent)
- Dim i, c, strReturned, b64map, b64pad, intLen
- b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_
- "abcdefghijklmnopqrstuvwxyz0123456789+/"
- b64pad="="
- intLen = Len(strContent)
- For i= To intLen- Step
- c=Clng("&h" & Mid(strContent,i+,))
- strReturned = strReturned &_
- Mid(b64map, Int(c / +), ) &_
- Mid(b64map, (c And )+, )
- Next
- If i+=intLen Then
- c =Clng("&h" & Mid(strContent,i+,))
- strReturned = strReturned & Mid(b64map, c * + , )
- ElseIf i+=intLen Then
- c =Clng("&h" & Mid(strContent,i+,))
- strReturned = strReturned & Mid(b64map, Int(c / ) + , ) &_
- Mid(b64map, (c And )*+, )
- End If
- While (Len(strReturned) And ) >
- strReturned = strReturned & b64pad
- Wend
- HexToB64 = strReturned
- End Function
有关Base24的代码实现网上也有很多,这里给出两种不同程序语言的实现供参考。
Base24的C语言实现
- static const char sel[] = {
- 'B','C','D','F','G',
- 'H','J','K','M','P',
- 'Q','R','T','V','W',
- 'X','Y','','','',
- '','','','', '\0'};
- char *b24e(char *buf, unsigned char *byst, size_t sizeOfBytes)
- {
- int i = ;
- unsigned char *p = byst;
- while ((size_t)(i = (p-byst)) < sizeOfBytes) {
- buf[*i] = sel[((*p) >> )];
- buf[(*i)+] = sel[ - ((*p) & 0x0f)];
- p++;
- }
- buf[(*i)+] = '\0';
- return buf;
- }
- unsigned char *b24d(unsigned char *buf, char *str, size_t countOfChars)
- {
- size_t i;
- char *p = str;
- char *loc[];
- unsigned char n[];
- if (countOfChars % )
- return NULL;
- for (i = ; i < (countOfChars>>); i++) {
- loc[] = strchr( sel, str[*i] );
- loc[] = strchr( sel, str[ ( *i ) + ] );
- if (loc[] == NULL || loc[] == NULL)
- return NULL;
- n[] = (unsigned char)( loc[] - sel );
- n[] = - (unsigned char)( loc[] - sel );
- buf[i] = (unsigned char)((n[] << ) | n[]);
- }
- return buf;
- }
后来由于项目需要,我特地改写了C#版。
- public static class Base24
- {
- private static string sel = "BCDFGHJKMPQRTVWXY2346789";
- public static string Encode(string Text)
- {
- int i = ;
- int Pos = ;
- char []Buf = new char[Text.Length<<];
- while ((i = Pos) < Text.Length)
- {
- Buf[i<<] = sel[(Text[Pos]) >> ];
- Buf[(i<<) + ] = sel[ - (Text[Pos] & 0x0F)];
- Pos++;
- }
- return new string(Buf);
- }
- public static string Decode(string Text)
- {
- if (Text.Length % != )
- return null;
- int [] NPos = new int[];
- char[] N = new char[];
- char[] Buf = new char[Text.Length >> ];
- for (int i = ; i < (Text.Length >> ); i++)
- {
- NPos[] = sel.IndexOf(Text[ i<< ]);
- NPos[] = - sel.IndexOf(Text[(i<<) + ]);
- if (NPos[] < || NPos[] < ) {
- return null;
- }
- Buf[i] = ((char)((NPos[] << ) | NPos[]));
- }
- return new string(Buf);
- }
- }
关于BASE 24 ,BASE 64原理以及实现程序的更多相关文章
- 24种编程语言的Hello World程序
24种编程语言的Hello World程序 这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java.C 语言.C++.C#.Ruby.Python.PHP 等编程语 ...
- VS2013下的64位与32位程序配置
VS2013下的64位与32位程序配置 在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目 ...
- 使用VS2008,VS2010编译64位的应用程序
要编译生成64位的应用程序,就必须把vs2008,或vs2010的配置管理器设置为x64. 如果你的配置管理器那里没有x64这个选项,那么是你在安装vs时可能没有安装这个组件.你不用卸载vs,只需打开 ...
- 关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题
关于Qt 5-MSVC 2015 64位在 win7 64位系统debug程序崩溃的问题 在win7 64位系统安装VC2015的编译器,并安装了 Qt 5.6 -5.7 VC2015 64位版本测 ...
- 分布式服务化系统一致性(分布式事务、ACID、BASE、CAP)原理与解决方案
https://blog.csdn.net/rickiyeat/article/details/70224722
- Linux实战教学笔记24:SSH连接原理及ssh-key
目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SSH服务 1.1 ssh介绍 1.2 知识小结 第2章 ssh结构 2.1 SSH加密技术 第3章 ssh服务认证类型 3.1 基于口令 ...
- PHP加密方式。 base!base!base!
PHP中的加密方式有如下几种 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str -- 原始字符串. ...
- 24、Checkpoint原理剖析
一.原理 1.Checkpoint是什么 Checkpoint,是Spark提供的一个比较高级的功能. 有的时候,比如说,我们的Spark应用程序,特别的复杂,然后呢,从初始的RDD开始,到最后整个应 ...
- Selenium 2自动化测试实战24(webdriver原理)
一.webdriver原理 webdriver是按照Server-Client的经典设计模式设计的.Server端就是Remote Server,可以是任意的浏览器.当我们的脚本启动浏览器后,该浏览器 ...
随机推荐
- LVS (Linux虚拟服务器)模型及算法
LVS(Linux Virtual Server)Linux虚拟服务器 LVS集群采用IP负载均衡技术和基于内容请求分发技术. 用户请求发给负载均衡调度器,由负载均衡调度器根据设定的调度算法将请求发给 ...
- 201671010447 杨露露 实验十四 团队项目评审&课程学习总结
项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 总结这学期软件工程学习获得 一 ...
- python 操作目录
每天写一点,总有一天我这条咸鱼能变得更咸 python 中对文件及目录的操作基本依赖与os,shutil模块,其中以os模块为主,最主要的几个方法实例如下: 1.判断文件/目录是否存在(os.path ...
- Game Publisher
“Amazon Appstore https://developer.amazon.com/why-amazonApple Store https://developer.apple.com/prog ...
- NOIP动态规划大合集
1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...
- 通过不断迭代,编写<通过中缀表达式,构造表达式树>的代码
今天要练习的算法是通过中缀表达式生成表达式树.中缀.前缀.后缀表达式的概念就不赘述了,学习链接:中缀.前缀.后缀表达式. 参考代码学习链接:表达式树—中缀表达式转换成后缀表达式(一). [迭代 ①]: ...
- 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解
昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...
- 洛谷 P2253 好一个一中腰鼓! 题解
P2253 好一个一中腰鼓! 题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:"忽一人 ...
- 使用Java8特性对list进行按属性去重
编写工具类 public class DistinctUtil { public static <T> Predicate<T> distinctByKey(Function& ...
- JVM系列之一:JVM架构
1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...