关于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 = 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 Function
End Class

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

‘ 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 = 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=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 = 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‘,‘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);
    }
}

=============== End

原文地址:https://www.cnblogs.com/lsgxeva/p/12021597.html

时间: 2024-08-09 10:02:30

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

X86-64 CPU架构以及64 位GCC对程序编译处理的一些变化

X86-64 CPU架构以及64 位GCC对程序编译处理的一些变化 作者:Jochen1986 转载请注明出处:http://blog.csdn.net/youkawa/article/details/45458921 通用寄存器全部扩展到了64位,寄存器名称前面由R开头,如RAX, RBX, RCX, RDX, RSI和RDI: 指令指针(Instruction pointer).基址指针(base pointer)以及堆栈指针(stack pointer)也全部扩展到了64位,这些专用寄存器

24种编程语言的Hello World程序

24种编程语言的Hello World程序 这篇文章主要介绍了 24 种编程语言的 Hello World 程序,包括熟知的 Java.C 语言.C++.C#.Ruby.Python.PHP 等编程语言,需要的朋友可以参考下. Hello World,几乎是程序猿学习各种语言的第一个程序.心血来潮,汇总并整理了下主流开发语言如何实现,包括大致快速了解下这门语言.开发.编译.环境搭建.运行.简单语言等,其实很多语言是有关联的.在当下,只掌握一门语言是不够的,比如说 Python,语言简洁.开发快是

【spine】原理介绍和程序实现

突然间,微博上被@了,一看原来是之前的关于介绍 spine 的文章引起的.然后就是一阵惭愧,又开了一坑,然后就木有了.虽然,一直在研究 spine,但是的确没写下来相关的内容.于是,赶紧,补了一些内容. 官网内容转发,没啥技术含量.我自己写的运行库也完成了,虽然还需要打磨,但是比官方的更符合2dx 的风格.做了许久之后,对 spine 的理解更深了一点,然后就胡乱介绍下设计思路和为什么这么做. 概念 先来介绍下 spine 中的一些术语和概念 Bone 骨骼 spine 是骨骼编辑器,所以骨骼是

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

要编译生成64位的应用程序,就必须把vs2008,或vs2010的配置管理器设置为x64. 如果你的配置管理器那里没有x64这个选项,那么是你在安装vs时可能没有安装这个组件.你不用卸载vs,只需打开你原来的安装包,安装上X64的编译.链接组件等即可.(就是在功能选择里,在VC++节点下,要选择X64编译器和工具.) 使用 x64 编译器和工具可以在 Win32 或 Win64 平台上开发 64 位应用程序. 这包括编译器:链接器:包括头文件和源代码的 C 运行时库.MFC.ATL 和标准模板库

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

VS2013下的64位与32位程序配置 在Windows 7 64bit和Visual Studio 2013下生成64位程序. 新建一个Visual Studio Win32 Console项目,命名为WinTestX64. 代码如下 #include "stdafx.h" #include <iostream> using namespace std; #define PRINT(a) cout << #a << ":" &l

Windows8 64位运行Silverlight程序不能访问WCF的解决方案

公司的项目是Silverlight+WCF,而我的本本是Win8 64位系统,一直无法正常运行Silverlight程序,一个同事找到了方案,现分享出来 一种情况是,Vs2010运行程序时,报无法加载项目,这时需要用管理员权限运行VS 第二种情况是:VS2010无法运行IIS进行程序调试,这时需要进行IIS的权限设置,如下图: 将权限设置允许 第三种情况,程序能在浏览器中运行,但是无法执行WCF服务,这时解决方案如下: 将Windows功能中的WCF服务中的Http激活,打上色,OK了! Win

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

PHP中的加密方式有如下几种 1. MD5加密 string md5 ( string $str [, bool $raw_output = false ] ) 参数 str  --  原始字符串. raw_output  --  如果可选的 raw_output 被设置为 TRUE,那么 MD5 报文摘要将以16字节长度的原始二进制格式返回. 这是一种不可逆加密,执行如下的代码 $password = '123456'; echo md5($password); 得到结果是e10adc3949

网络漏洞扫描的原理和相关程序

1 引言 网络扫描,是基于Internet的.探测远端网络或主机信息的一种技术,也是保证系统和网络安全必不可少的一种手段.主机扫描,是指对计算机主机或者其它网络设备进行安全性检测,以找出安全隐患和系统漏洞.总体而言,网络扫描和主机扫描都可归入漏洞扫描一类.漏洞扫描本质上是一把双刃剑:黑客利用它来寻找对网络或系统发起攻击的途径,而系统管理员则利用它来有效防范黑客入侵.通过漏洞扫描,扫描者能够发现远端网络或主机的配置信息. TCP/UDP端口的分配.提供的网络服务.服务器的具体信息等. 2 漏洞扫描

12864点阵液晶显示模块的原理和实例程序(HJ12864M-1)

12864点阵液晶显示模块(LCM)就是由 128*64个液晶显示点组成的一个128列*64行的阵列.每个显示点对应一位二进制数,1表示亮,0表示灭.存储这些点阵信息的RAM称为显示数据存 储器.要显示某个图形或汉字就是将相应的点阵信息写入到相应的存储单元中.图形或汉字的点阵信息当然由自己设计,问题的关键就是显示点在液晶屏上的位置 (行和列)与其在存储器中的地址之间的关系. 由于多数液晶显示模块的驱动电路是由一片行驱动器和两 片列驱动器构成,所以12864液晶屏实际上是由左右两块独立的64*64