关于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);
}
}
=============== End
 

关于BASE 24 ,BASE 64原理以及实现程序的更多相关文章

  1. 24种编程语言的Hello World程序

    24种编程语言的Hello World程序 这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java.C 语言.C++.C#.Ruby.Python.PHP 等编程语 ...

  2. VS2013下的64位与32位程序配置

    VS2013下的64位与32位程序配置   在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目 ...

  3. 使用VS2008,VS2010编译64位的应用程序

    要编译生成64位的应用程序,就必须把vs2008,或vs2010的配置管理器设置为x64. 如果你的配置管理器那里没有x64这个选项,那么是你在安装vs时可能没有安装这个组件.你不用卸载vs,只需打开 ...

  4. 关于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位版本测 ...

  5. 分布式服务化系统一致性(分布式事务、ACID、BASE、CAP)原理与解决方案

    https://blog.csdn.net/rickiyeat/article/details/70224722

  6. Linux实战教学笔记24:SSH连接原理及ssh-key

    目录 第二十四节 SSH连接原理及ssh-key讲解 第1章 SSH服务 1.1 ssh介绍 1.2 知识小结 第2章 ssh结构 2.1 SSH加密技术 第3章 ssh服务认证类型 3.1 基于口令 ...

  7. PHP加密方式。 base!base!base!

    PHP中的加密方式有如下几种 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. ...

  8. 24、Checkpoint原理剖析

    一.原理 1.Checkpoint是什么 Checkpoint,是Spark提供的一个比较高级的功能. 有的时候,比如说,我们的Spark应用程序,特别的复杂,然后呢,从初始的RDD开始,到最后整个应 ...

  9. Selenium 2自动化测试实战24(webdriver原理)

    一.webdriver原理 webdriver是按照Server-Client的经典设计模式设计的.Server端就是Remote Server,可以是任意的浏览器.当我们的脚本启动浏览器后,该浏览器 ...

随机推荐

  1. update的where条件要把索引的字段带上,要不然就全表锁

    update的where条件要把索引的字段带上,要不然就全表锁 文章目录 update的where条件要把索引的字段带上,要不然就全表锁        本文主要内容        背景        ...

  2. Codeforces H. Kilani and the Game(多源BFS)

    题目描述: Kilani and the Game time limit per test 2 seconds memory limit per test 256 megabytes input st ...

  3. 201800628模拟赛T2——最大土地面积

    题目描述 在某块平面土地上有N个点,你可以选择其中的任意四个点,将这片土地围起来,当然,你希望这四个点围成的多边形面积最大. 输入输出格式 输入格式: 第1行一个正整数N,接下来N行,每行2个数x,y ...

  4. Git工具使用基础

    Git 是一个分布式的版本控制工具,本篇文章从介绍Git开始,重点在于介绍Git的基本命令和使用技巧,让你尝试使用Git的同时,体验到原来一个版 本控制工具可以对开发产生如此之多的影响,文章分为两部分 ...

  5. 利用easyui的行编辑自动增加一行来进行增删有详细注解

    jQuery EasyUI 框架提供了创建网页所需的一切,帮助您轻松建立站点. easyui 是一个基于 jQuery 的框架,集成了各种用户界面插件. easyui 提供建立现代化的具有交互性的 j ...

  6. Educational Codeforces Round 78 (Rated for Div. 2) A. Shuffle Hashing

    链接: https://codeforces.com/contest/1278/problem/A 题意: Polycarp has built his own web service. Being ...

  7. ubunt 文件permission denied问题的解决

    在linux系统使用过程中,升级python到3.6以后,执行pip命令,遇到permission denied问题,系统显示如下: -bash: /home/www/my_flask/venv/bi ...

  8. 踩iviewui中Tabs 标签页数据绑定坑

    今天小颖要实现点击Tabs 标签页中每个标签,并动态获取当前点击的标签值. 一句话说不清楚,那就看动态图吧 小颖一开始看官网写的代码是: <template> <Tabs :valu ...

  9. axios post方式请求x-ww格式的数据

    //使用axios时,要确定是json格式还是x-www格式的,axios默认是json格式的,如果是x-ww格式需要做如下配置: let url = "/hehe/site/getcomm ...

  10. 第02组 团队Git现场编程实战

    目录 1. 组员职责分工(2分) 2. github 的提交日志截图(1分) 3. 程序运行截图(3分) 4. 程序运行环境(1分) 5. GUI界面(5分) 6. 基础功能实现(10分) 7. 鼓励 ...