热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Base64编码/解码Delphi源码

UnitCnBase64;InterfaceUsesSysUtils,Windows;FunctionBase64Encode(InputData:String;VarOutputD

Unit CnBase64;

Interface

Uses
   SysUtils, Windows;

Function Base64Encode(InputData: String; Var OutputData: String): byte;
  {* 对数据进行BASE64编码,如编码成功返回Base64_OK
  |


    InputData:string        - 要编码的数据
    var OutputData: string  - 编码后的数据
  |
}

Function Base64Decode(InputData: String; Var OutputData: String): byte;
  {* 对数据进行BASE64解码,如解码成功返回Base64_OK
  |


    InputData:string        - 要解码的数据
    var OutputData: string  - 解码后的数据
  |
}

Const
   BASE64_OK        = 0;                // 转换成功
   BASE64_ERROR     = 1;
          // 转换错误(未知错误) (e.g. can't encode octet in input stream) -> error in implementation
   BASE64_INVALID   = 2;
          // 输入的字符串中有非法字符 (在 FilterDecodeInput=False 时可能出现)
   BASE64_LENGTH    = 3;                // 数据长度非法
   BASE64_DATALEFT  = 4;
          // too much input data left (receveived 'end of encoded data' but not end of input string)
   BASE64_PADDING   = 5;                // 输入的数据未能以正确的填充字符结束

Implementation

Var
   FilterDecodeInput: Boolean = true;
Const
   Base64TableLength = 64;
   Base64Table      : String[Base64TableLength] =
      'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+*';
   Pad              = '=';

Function Base64Encode(InputData: String; Var OutputData: String): byte;
Var
   i                : integer;
   CurrentB, PrevB  : byte;
   c                : byte;
   s                : char;
   InputLength      : integer;

   Function ValueToCharacter(value: byte; Var character: char): Boolean;
  //******************************************************************
  // 将一个在0..Base64TableLength-1区间内的值,转换为与Base64编码相对应
  // 的字符来表示,如果转换成功则返回True
  //******************************************************************
   Begin
      result := true;
      If (value > Base64TableLength - 1) Then
         result := false
      Else
         character := Base64Table[value + 1];
   End;

Begin
   OutputData := '';
   InputLength := Length(InputData);
   i := 1;
   If (InputLength = 0) Then Begin
      result := BASE64_OK;
      Exit;
   End;

   Repeat
    // 第一次转换
      CurrentB := Ord(InputData[i]);
      i := i + 1;
      InputLength := InputLength - 1;
      c := (CurrentB Shr 2);
      If Not ValueToCharacter(c, s) Then Begin
         result := BASE64_ERROR;
         Exit;
      End;
      OutputData := OutputData + s;
      PrevB := CurrentB;

    // 第二次转换
      If InputLength = 0 Then
         CurrentB := 0
      Else Begin
         CurrentB := Ord(InputData[i]);
         i := i + 1;
      End;
      InputLength := InputLength - 1;
      c := (PrevB And $03) Shl 4 + (CurrentB Shr 4);
               //取出XX后4位并将其左移4位与XX右移4位合并成六位
      If Not ValueToCharacter(c, s) Then
      {//检测取得的字符是否在Base64Table内} Begin
         result := BASE64_ERROR;
         Exit;
      End;
      OutputData := OutputData + s;
      PrevB := CurrentB;

    // 第三次转换
      If InputLength <0 Then
         s := Pad
      Else Begin
         If InputLength = 0 Then
            CurrentB := 0
         Else Begin
            CurrentB := Ord(InputData[i]);
            i := i + 1;
         End;
         InputLength := InputLength - 1;
         c := (PrevB And $0F) Shl 2 + (CurrentB Shr 6);
                    //取出XX后4位并将其左移2位与XX右移6位合并成六位
         If Not ValueToCharacter(c, s) Then
         {//检测取得的字符是否在Base64Table内} Begin
            result := BASE64_ERROR;
            Exit;
         End;
      End;
      OutputData := OutputData + s;

    // 第四次转换
      If InputLength <0 Then
         s := Pad
      Else Begin
         c := (CurrentB And $3F);       //取出XX后6位
         If Not ValueToCharacter(c, s) Then
         {//检测取得的字符是否在Base64Table内} Begin
            result := BASE64_ERROR;
            Exit;
         End;
      End;
      OutputData := OutputData + s;
   Until InputLength <= 0;
   result := BASE64_OK;
End;

Function Base64Decode(InputData: String; Var OutputData: String): byte;
Var
   i                : integer;
   InputLength      : integer;
   CurrentB, PrevB  : byte;
   c                : byte;
   s                : char;

   Function CharacterToValue(character: char; Var value: byte): Boolean;
  //******************************************************************
  // 转换字符为一在0..Base64TableLength-1区间中的值,如果转换成功则返
  // 回True(即字符在Base64Table中)
  //******************************************************************
   Begin
      result := true;
      value := Pos(character, Base64Table);
      If value = 0 Then
         result := false
      Else
         value := value - 1;
   End;

   Function FilterLine(InputData: String): String;
  //******************************************************************
  // 过滤所有不在Base64Table中的字符,返回值为过滤后的字符
  //******************************************************************
   Var
      F             : byte;
      i             : integer;
   Begin
      result := '';
      For i := 1 To Length(InputData) Do
         If CharacterToValue(InputData[i], F) Or (InputData[i] = Pad) Then
            result := result + InputData[i];
   End;

Begin
   If (InputData = '') Then Begin
      result := BASE64_OK;
      Exit;
   End;
   OutputData := '';

   If FilterDecodeInput Then
      InputData := FilterLine(InputData);

   InputLength := Length(InputData);
   If InputLength Mod 4 <> 0 Then Begin
      result := BASE64_LENGTH;
      Exit;
   End;

   i := 0;
   Repeat
    // 第一次转换
      i := i + 1;
      s := InputData[i];
      If Not CharacterToValue(s, CurrentB) Then Begin
         result := BASE64_INVALID;
         Exit;
      End;
      i := i + 1;
      s := InputData[i];
      If Not CharacterToValue(s, PrevB) Then Begin
         result := BASE64_INVALID;
         Exit;
      End;

      c := (CurrentB Shl 2) + (PrevB Shr 4);
      OutputData := OutputData + Chr(c);

    // 第二次转换
      i := i + 1;
      s := InputData[i];
      If s = Pad Then Begin
         If (i <> InputLength - 1) Then Begin
            result := BASE64_DATALEFT;
            Exit;
         End
         Else
            If InputData[i + 1] <> Pad Then Begin
               result := BASE64_PADDING;
               Exit;
            End;
      End
      Else Begin
         If Not CharacterToValue(s, CurrentB) Then Begin
            result := BASE64_INVALID;
            Exit;
         End;
         c := (PrevB Shl 4) + (CurrentB Shr 2);
         OutputData := OutputData + Chr(c);
      End;

    // 第三次转换
      i := i + 1;
      s := InputData[i];
      If s = Pad Then Begin
         If (i <> InputLength) Then Begin
            result := BASE64_DATALEFT;
            Exit;
         End;
      End
      Else Begin
         If Not CharacterToValue(s, PrevB) Then Begin
            result := BASE64_INVALID;
            Exit;
         End;
         c := (CurrentB Shl 6) + (PrevB);
         OutputData := OutputData + Chr(c);
      End;

   Until (i >= InputLength);
   result := BASE64_OK;
End;

End.
=======================================================================================
Uses CnBase64;
CnBase64.Base64Encode(Edit1.Text, Psw64);

 
推荐阅读
  • 前景:当UI一个查询条件为多项选择,或录入多个条件的时候,比如查询所有名称里面包含以下动态条件,需要模糊查询里面每一项时比如是这样一个数组条件:newstring[]{兴业银行, ... [详细]
  • 深入理解CSS中的margin属性及其应用场景
    本文主要介绍了CSS中的margin属性及其应用场景,包括垂直外边距合并、padding的使用时机、行内替换元素与费替换元素的区别、margin的基线、盒子的物理大小、显示大小、逻辑大小等知识点。通过深入理解这些概念,读者可以更好地掌握margin的用法和原理。同时,文中提供了一些相关的文档和规范供读者参考。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • 全面介绍Windows内存管理机制及C++内存分配实例(四):内存映射文件
    本文旨在全面介绍Windows内存管理机制及C++内存分配实例中的内存映射文件。通过对内存映射文件的使用场合和与虚拟内存的区别进行解析,帮助读者更好地理解操作系统的内存管理机制。同时,本文还提供了相关章节的链接,方便读者深入学习Windows内存管理及C++内存分配实例的其他内容。 ... [详细]
  • Python中sys模块的功能及用法详解
    本文详细介绍了Python中sys模块的功能及用法,包括对解释器参数和功能的访问、命令行参数列表、字节顺序指示符、编译模块名称等。同时还介绍了sys模块中的新功能和call_tracing函数的用法。推荐学习《Python教程》以深入了解。 ... [详细]
  • 抽空写了一个ICON图标的转换程序
    抽空写了一个ICON图标的转换程序,支持png\jpe\bmp格式到ico的转换。具体的程序就在下面,如果看的人多,过两天再把思路写一下。 ... [详细]
  • loader资源模块加载器webpack资源模块加载webpack内部(内部loader)默认只会处理javascript文件,也就是说它会把打包过程中所有遇到的 ... [详细]
  • asp中如何嵌入python的简单介绍
    本文目录一览:1、如何在IIS中执行Python脚本 ... [详细]
  • VBA操作Excel之设置单元格属性
    VBA操作Excel简介一、VBA读写Excel文件二、VBA设置单元格属性三、VBA弹出输入和输出窗口参考文档一、VBA读写Excel文件VBA简介及打开Excel文件方法见VB ... [详细]
  • vb.net面试题,请大家帮忙,谢谢。如果需要讲详细一点,那就加我QQ531412815第4题,潜在的错误,这里的错误不是常规错误,属于那种只有在运行是才知道的错误:Catchex ... [详细]
  • 本文介绍了在iOS开发中使用UITextField实现字符限制的方法,包括利用代理方法和使用BNTextField-Limit库的实现策略。通过这些方法,开发者可以方便地限制UITextField的字符个数和输入规则。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • PHP组合工具以及开发所需的工具
    本文介绍了PHP开发中常用的组合工具和开发所需的工具。对于数据分析软件,包括Excel、hihidata、SPSS、SAS、MARLAB、Eview以及各种BI与报表工具等。同时还介绍了PHP开发所需的PHP MySQL Apache集成环境,包括推荐的AppServ等版本。 ... [详细]
  • vb.net不用多线程如何同时运行两个过程?不用多线程?即使用多线程,也不会是“同时”执行,题主只要略懂一些计算机编译原理就能明白了。不用多线程更不可能让两个过程同步执行了。不过可 ... [详细]
  • Opencv提供了几种分类器,例程里通过字符识别来进行说明的1、支持向量机(SVM):给定训练样本,支持向量机建立一个超平面作为决策平面,使得正例和反例之间的隔离边缘被最大化。函数原型:训练原型cv ... [详细]
author-avatar
手机用户2602937555
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有