关于BASE 24 ,BASE 64原理以及实现程序

来源:互联网 发布:手机淘宝怎么晒图 编辑:程序博客网 时间:2024/06/11 13:08

可能很多人听说过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实现:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
Class CBase64  Private objXmlDom  Private objXmlNode   ' GetObjectParam() 这个函数实现参考了开源项目PJBlog  Private Function GetObjectParam()   On Error Resume Next   Dim Temp   GetObjectParam = "Microsoft.XMLDOM"   Err = 0   Dim TmpObj   Set TmpObj = Server.CreateObject(GetObjectParam)   Temp = Err.Number   If Temp = 1 Or Temp = -2147221005 Then       GetObjectParam = "Msxml2.DOMDocument.5.0"    End If    Err.Clear    Set TmpObj = Nothing   Err = 0  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 = 2            If .State = 0 Then .Open            .WriteText str            .Position = 0            .Type = 1            r = encode(.Read(-1))            .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 = 1            If .State = 0 Then .Open            .Write (decode(str))            .Position = 0            .Type = 2            r = .ReadText(-1)            .Close        End With    Set ado = Nothing    End If    If Err Then Err.Clear: r = ""    decodeText = r  End FunctionEnd Class

写到这里想起以前项目里改写过一段Base64和16进制互转的代码,在这里与大家分享下。

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
' Base64转16进制Function B64ToHex(ByVal strContent)  Dim i,strReturned, b64pad, _       b64map, chTemp, intLocate, k , slop  strReturned = "" : k = 0  b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_              "abcdefghijklmnopqrstuvwxyz0123456789+/"  b64pad="="  For i=0 To Len(strContent)-1     chTemp = Mid(strContent, i+1, 1)     If chTemp = b64pad Then Exit For     intLocate = InStr(1, b64map, chTemp, 0)-1     If intLocate > -1 Then         Select Case K           Case 0           strReturned = strReturned &_                             Int2Char(Int(intLocate / 4))           slop = intLocate And 3 :  k = 1           Case 1           strReturned = strReturned &_                              Int2Char( (slop * 4) Or (Int(intLocate / 16)) )          slop = intLocate And &h0f :  k = 2          Case 2          strReturned = strReturned &_                             Int2Char(slop) & Int2Char(Int(intLocate / 4))          slop = intLocate And 3  : k=3          Case Else          strReturned = strReturned &_                             Int2Char( (slop * 4) Or (Int(intLocate / 16)) ) &_                             Int2Char(intLocate And &h0f)          k = 0        End Select     End If  Next  If k=1 Then strReturned = strReturned & Int2Char(slop * 4)  B64ToHex = strReturnedEnd Function ' 16进制转Base64Function HexToB64(ByVal strContent)  Dim i, c, strReturned, b64map, b64pad, intLen  b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_             "abcdefghijklmnopqrstuvwxyz0123456789+/"  b64pad="="  intLen = Len(strContent)  For i=0 To intLen-3 Step 3      c=Clng("&h" & Mid(strContent,i+1,3))      strReturned = strReturned &_                         Mid(b64map, Int(c / 64 +1), 1) &_                         Mid(b64map, (c And 63)+1, 1)  Next   If i+1=intLen Then     c =Clng("&h" & Mid(strContent,i+1,1))     strReturned = strReturned & Mid(b64map, c * 4 + 1, 1)  ElseIf i+2=intLen Then     c =Clng("&h" & Mid(strContent,i+1,2))     strReturned = strReturned & Mid(b64map, Int(c / 4) + 1, 1) &_                        Mid(b64map, (c And 3)*16+1, 1)  End If   While (Len(strReturned) And 3) >0      strReturned = strReturned & b64pad  Wend  HexToB64 = strReturnedEnd 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','2','3','4', '6','7','8','9', '\0'}; char *b24e(char *buf, unsigned char *byst, size_t sizeOfBytes){ int i = 0; unsigned char *p = byst; while ((size_t)(i = (p-byst)) < sizeOfBytes) {  buf[2*i] = sel[((*p) >> 4)];  buf[(2*i)+1] = sel[23 - ((*p) & 0x0f)];  p++; } buf[(2*i)+1] = '\0'; return buf;} unsigned char *b24d(unsigned char *buf, char *str, size_t countOfChars){ size_t i; char *p = str; char *loc[2]; unsigned char n[2]; if (countOfChars % 2)  return NULL; for (i = 0; i < (countOfChars>>1); i++) {   loc[0] = strchr( sel, str[2*i] );  loc[1] = strchr( sel, str[ ( 2*i ) + 1 ] );  if (loc[0] == NULL || loc[1] == NULL)   return NULL;  n[0] = (unsigned char)( loc[0] - sel );  n[1] = 23 - (unsigned char)( loc[1] - sel );  buf[i] = (unsigned char)((n[0] << 4) | n[1]); } return buf;}    

 

后来由于项目需要,我特地改写了C#版。

 public static class Base24{  private static string sel = "BCDFGHJKMPQRTVWXY2346789";   public static string Encode(string Text)  {    int i = 0;    int Pos = 0;    char []Buf = new char[Text.Length<<1];     while ((i = Pos) < Text.Length)    {        Buf[i<<1] = sel[(Text[Pos]) >> 4];        Buf[(i<<1) + 1] = sel[23 - (Text[Pos] & 0x0F)];        Pos++;     }         return new string(Buf);    }     public static string Decode(string Text)    {        if (Text.Length % 2 != 0)            return null;         int [] NPos = new int[2];        char[] N = new char[2];        char[] Buf = new char[Text.Length >> 1];         for (int i = 0; i < (Text.Length >> 1); i++)        {            NPos[0] = sel.IndexOf(Text[ i<<1 ]);            NPos[1] = 23 - sel.IndexOf(Text[(i<<1) + 1]);            if (NPos[0] < 0 || NPos[1] < 0) {                return null;            }             Buf[i] = ((char)((NPos[0] << 4) | NPos[1]));        }            return new string(Buf);    }}    
原创粉丝点击