关于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实现:

  1. Class CBase64
  2. Private objXmlDom
  3. Private objXmlNode
  4.  
  5. ' GetObjectParam() 这个函数实现参考了开源项目PJBlog
  6. Private Function GetObjectParam()
  7. On Error Resume Next
  8. Dim Temp
  9. GetObjectParam = "Microsoft.XMLDOM"
  10. Err =
  11. Dim TmpObj
  12. Set TmpObj = Server.CreateObject(GetObjectParam)
  13. Temp = Err.Number
  14. If Temp = Or Temp = - Then
  15. GetObjectParam = "Msxml2.DOMDocument.5.0"
  16. End If
  17. Err.Clear
  18. Set TmpObj = Nothing
  19. Err =
  20. End Function
  21.  
  22. Private Sub Class_Initialize()
  23. Set objXmlDom = Server.CreateObject(GetObjectParam())
  24. End Sub
  25.  
  26. Private Sub Class_Terminate()
  27. Set objXmlDom = Nothing
  28. End Sub
  29.  
  30. Public Function encode(AnsiCode)
  31. encode = ""
  32. Set objXmlNode = objXmlDom.createElement("tmp")
  33. objXmlNode.datatype = "bin.base64"
  34. objXmlNode.nodeTypedvalue = AnsiCode
  35. encode = objXmlNode.Text
  36. Set objXmlNode = Nothing
  37. End Function
  38.  
  39. Public Function decode(base64Code)
  40. On Error Resume Next
  41. decode = ""
  42. Set objXmlNode = objXmlDom.createElement("tmp")
  43. objXmlNode.datatype = "bin.base64"
  44. objXmlNode.Text = base64Code
  45. decode = objXmlNode.nodeTypedvalue
  46. Set objXmlNode = Nothing
  47. If Err Then
  48. Err.Clear
  49. End If
  50. End Function
  51.  
  52. ' 以下函数编码字符串
  53. Public Function encodeText(ByVal str)
  54. On Error Resume Next
  55. Dim ado, r: r = ""
  56. If str <> "" Then
  57. Set ado = Server.CreateObject("ADODB.Stream")
  58. With ado
  59. .Charset = "gb2312"
  60. .Type =
  61. If .State = Then .Open
  62. .WriteText str
  63. .Position =
  64. .Type =
  65. r = encode(.Read(-))
  66. .Close
  67. End With
  68. Set ado = Nothing
  69. End If
  70. If Err Then Err.Clear: r = ""
  71. encodeText = r
  72. End Function
  73.  
  74. ' 以下函数解码字符串
  75. Public Function decodeText(ByVal str)
  76. On Error Resume Next
  77. Dim ado, r: r = ""
  78. If str <> "" Then
  79. Set ado = Server.CreateObject("ADODB.Stream")
  80. With ado
  81. .Charset = "gb2312"
  82. .Type =
  83. If .State = Then .Open
  84. .Write (decode(str))
  85. .Position =
  86. .Type =
  87. r = .ReadText(-)
  88. .Close
  89. End With
  90. Set ado = Nothing
  91. End If
  92. If Err Then Err.Clear: r = ""
  93. decodeText = r
  94. End Function
  95. End Class

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

  1. ' Base64转16进制
  2. Function B64ToHex(ByVal strContent)
  3. Dim i,strReturned, b64pad, _
  4. b64map, chTemp, intLocate, k , slop
  5. strReturned = "" : k =
  6. b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_
  7. "abcdefghijklmnopqrstuvwxyz0123456789+/"
  8. b64pad="="
  9. For i= To Len(strContent)-
  10. chTemp = Mid(strContent, i+, )
  11. If chTemp = b64pad Then Exit For
  12. intLocate = InStr(, b64map, chTemp, )-
  13. If intLocate > - Then
  14. Select Case K
  15. Case
  16. strReturned = strReturned &_
  17. Int2Char(Int(intLocate / ))
  18. slop = intLocate And : k =
  19. Case
  20. strReturned = strReturned &_
  21. Int2Char( (slop * ) Or (Int(intLocate / )) )
  22. slop = intLocate And &h0f : k =
  23. Case
  24. strReturned = strReturned &_
  25. Int2Char(slop) & Int2Char(Int(intLocate / ))
  26. slop = intLocate And : k=
  27. Case Else
  28. strReturned = strReturned &_
  29. Int2Char( (slop * ) Or (Int(intLocate / )) ) &_
  30. Int2Char(intLocate And &h0f)
  31. k =
  32. End Select
  33. End If
  34. Next
  35. If k= Then strReturned = strReturned & Int2Char(slop * )
  36. B64ToHex = strReturned
  37. End Function
  38.  
  39. ' 16进制转Base64
  40. Function HexToB64(ByVal strContent)
  41. Dim i, c, strReturned, b64map, b64pad, intLen
  42. b64map="ABCDEFGHIJKLMNOPQRSTUVWXYZ" &_
  43. "abcdefghijklmnopqrstuvwxyz0123456789+/"
  44. b64pad="="
  45. intLen = Len(strContent)
  46. For i= To intLen- Step
  47. c=Clng("&h" & Mid(strContent,i+,))
  48. strReturned = strReturned &_
  49. Mid(b64map, Int(c / +), ) &_
  50. Mid(b64map, (c And )+, )
  51. Next
  52.  
  53. If i+=intLen Then
  54. c =Clng("&h" & Mid(strContent,i+,))
  55. strReturned = strReturned & Mid(b64map, c * + , )
  56. ElseIf i+=intLen Then
  57. c =Clng("&h" & Mid(strContent,i+,))
  58. strReturned = strReturned & Mid(b64map, Int(c / ) + , ) &_
  59. Mid(b64map, (c And )*+, )
  60. End If
  61.  
  62. While (Len(strReturned) And ) >
  63. strReturned = strReturned & b64pad
  64. Wend
  65. HexToB64 = strReturned
  66. End Function

有关Base24的代码实现网上也有很多,这里给出两种不同程序语言的实现供参考。

Base24的C语言实现

  1. static const char sel[] = {
  2. 'B','C','D','F','G',
  3. 'H','J','K','M','P',
  4. 'Q','R','T','V','W',
  5. 'X','Y','','','',
  6. '','','','', '\0'};
  7.  
  8. char *b24e(char *buf, unsigned char *byst, size_t sizeOfBytes)
  9. {
  10. int i = ;
  11. unsigned char *p = byst;
  12. while ((size_t)(i = (p-byst)) < sizeOfBytes) {
  13. buf[*i] = sel[((*p) >> )];
  14. buf[(*i)+] = sel[ - ((*p) & 0x0f)];
  15. p++;
  16. }
  17. buf[(*i)+] = '\0';
  18. return buf;
  19. }
  20.  
  21. unsigned char *b24d(unsigned char *buf, char *str, size_t countOfChars)
  22. {
  23. size_t i;
  24. char *p = str;
  25. char *loc[];
  26. unsigned char n[];
  27. if (countOfChars % )
  28. return NULL;
  29. for (i = ; i < (countOfChars>>); i++) {
  30.  
  31. loc[] = strchr( sel, str[*i] );
  32. loc[] = strchr( sel, str[ ( *i ) + ] );
  33. if (loc[] == NULL || loc[] == NULL)
  34. return NULL;
  35. n[] = (unsigned char)( loc[] - sel );
  36. n[] = - (unsigned char)( loc[] - sel );
  37. buf[i] = (unsigned char)((n[] << ) | n[]);
  38. }
  39. return buf;
  40. }

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

  1. public static class Base24
  2. {
  3. private static string sel = "BCDFGHJKMPQRTVWXY2346789";
  4.  
  5. public static string Encode(string Text)
  6. {
  7. int i = ;
  8. int Pos = ;
  9. char []Buf = new char[Text.Length<<];
  10.  
  11. while ((i = Pos) < Text.Length)
  12. {
  13. Buf[i<<] = sel[(Text[Pos]) >> ];
  14. Buf[(i<<) + ] = sel[ - (Text[Pos] & 0x0F)];
  15. Pos++;
  16. }
  17.  
  18. return new string(Buf);
  19. }
  20.  
  21. public static string Decode(string Text)
  22. {
  23. if (Text.Length % != )
  24. return null;
  25.  
  26. int [] NPos = new int[];
  27. char[] N = new char[];
  28. char[] Buf = new char[Text.Length >> ];
  29.  
  30. for (int i = ; i < (Text.Length >> ); i++)
  31. {
  32. NPos[] = sel.IndexOf(Text[ i<< ]);
  33. NPos[] = - sel.IndexOf(Text[(i<<) + ]);
  34. if (NPos[] < || NPos[] < ) {
  35. return null;
  36. }
  37.  
  38. Buf[i] = ((char)((NPos[] << ) | NPos[]));
  39. }
  40. return new string(Buf);
  41. }
  42. }
=============== 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. LVS (Linux虚拟服务器)模型及算法

    LVS(Linux Virtual Server)Linux虚拟服务器 LVS集群采用IP负载均衡技术和基于内容请求分发技术. 用户请求发给负载均衡调度器,由负载均衡调度器根据设定的调度算法将请求发给 ...

  2. 201671010447 杨露露 实验十四 团队项目评审&课程学习总结

    项目 内容 这个作业属于哪个课程 2016计算机科学与工程学院软件工程(西北师范大学) 这个作业的要求在哪里 实验十四 团队项目评审&课程学习总结 作业学习目标 总结这学期软件工程学习获得 一 ...

  3. python 操作目录

    每天写一点,总有一天我这条咸鱼能变得更咸 python 中对文件及目录的操作基本依赖与os,shutil模块,其中以os模块为主,最主要的几个方法实例如下: 1.判断文件/目录是否存在(os.path ...

  4. Game Publisher

    “Amazon Appstore https://developer.amazon.com/why-amazonApple Store https://developer.apple.com/prog ...

  5. NOIP动态规划大合集

    1.前言 NOIP2003-2014动态规划题目大合集,有简单的也有难的(对于我这种动态规划盲当然存在难的),今天就把这些东西归纳一下,做一个比较全面的总结,方便对动态规划有一个更深的理解. 2.NO ...

  6. 通过不断迭代,编写<通过中缀表达式,构造表达式树>的代码

    今天要练习的算法是通过中缀表达式生成表达式树.中缀.前缀.后缀表达式的概念就不赘述了,学习链接:中缀.前缀.后缀表达式. 参考代码学习链接:表达式树—中缀表达式转换成后缀表达式(一). [迭代 ①]: ...

  7. 洛谷 P1801 黑匣子_NOI导刊2010提高(06) 题解

    昨晚恶补了一下二叉堆的内容 然后就找了几个二叉堆的题来做awa 然后发现用二叉堆做这题复杂度是O(nlogn) 但是有O(n)的解法 (某大佬这么说) 思路大概就是: 利用一个大根堆一个小根堆来维护第 ...

  8. 洛谷 P2253 好一个一中腰鼓! 题解

    P2253 好一个一中腰鼓! 题目背景 话说我大一中的运动会就要来了,据本班同学剧透(其实早就知道了),我萌萌的初二年将要表演腰鼓[喷],这个无厘头的题目便由此而来. Ivan乱入:"忽一人 ...

  9. 使用Java8特性对list进行按属性去重

    编写工具类 public class DistinctUtil { public static <T> Predicate<T> distinctByKey(Function& ...

  10. JVM系列之一:JVM架构

    1.简介 Java平台可分为两部分,即Java虚拟机(Java virtual machine,JVM)和Java API类库. JVM是Java Virtual Machine(Java虚拟机)的缩 ...