⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 base32.pas

📁 很好的手机发短信的例子。含GSM群发机设计原理和使用说明。还有详细代码
💻 PAS
字号:
unit base32;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Math,
  StdCtrls;


function Base32Encode( szBuf: string ): string;
function Base32Decode( szBuf:string ): string;

implementation

const
    TOKEN='ABCDEFGHIJKLMNPQRSTVWXY123456789'; // 32 Len
    FAKE='!#<>+=()[]{}?/\*%';

function AddFAKE2Base32(StrLength: Integer; Base32Str: string): string;
var
  i: integer;
  CurrentLen: integer;
  RandomPosition: integer;
begin
  Result:= Base32Str;
  if StrLength<Length(Base32Str) then
    exit;

  CurrentLen:= Length(Base32Str);
  for i:= CurrentLen+1 to StrLength do
  begin
    RandomPosition:= Random(length(Result))+1;
    Result:= copy(Result,1,RandomPosition)
      +FAKE[random(length(FAKE))+1]
      +copy(Result,RandomPosition+1,length(Result));
  end;
end;

function DecFAKE2Base32(fakeStr: string): string;
var
  i: Integer;
  j: integer;
  tempStr: string;
begin
  for i:=1 to Length(fakeStr) do
    for j:=1 to length(TOKEN) do
    begin
      if fakeStr[i]= token[j] then
      begin
        Result := Result+fakeStr[i];
        break;
      end;
    end;
end;

function Base32DecodeLen( nBase32Len: integer ):integer;
begin
    result:=Trunc(nBase32Len*5/8);
end;

function Base32EncodeLen( nStrLen:integer ):integer;
begin
    result:=ceil(nStrLen*8.0/5);;
end;

function Base32Encode( szBuf: string ): string;
var
    nDstLen, k, iBit, iIndex, iValue: integer;
    szDst: string;
begin
    iBit:=7;
    iIndex:=1;
    nDstLen:=Base32EncodeLen( Length(szBuf));
    for k:=1 to nDstLen do begin
        if iBit<4 then // should calc 2 bytes
            iValue:=((Ord(szBuf[iIndex]) and ($FF shr (7-iBit))) shl (4-iBit))+(Ord(szBuf[iIndex+1]) shr (4+iBit))
        else // only need to extract value from 1 byte
            iValue:=(Ord(szBuf[iIndex]) and ($FF shr (7-iBit)))shr(iBit-4);
        szDst:=szDst+TOKEN[iValue+1];
        iBit:=iBit-5;
        if (iBit<0) then
        begin
            iBit:=iBit+8;
            Inc(iIndex);
        end;
    end;
    result:=AddFAKE2Base32(25,szDst);
end;

function Base32Decode( szBuf:string ): string;
var
    nDstLen, k, p, iBit, iIndex, iValue, iLast: integer;
    szDst: string;
begin
    szBuf:=DecFAKE2Base32(szBuf);
    iBit:=7;
    nDstLen:=Base32DecodeLen( Length(szBuf));
    iLast:=0;
    for k:=1 to Length(szBuf) do begin
        iValue:=Pos(szBuf[k], TOKEN)-1;
        if(iValue<0) then exit;
        if(iBit<4) then //
            iLast:=iLast or (iValue shr (4-iBit))
        else
            iLast:=iLast or (iValue shl(iBit-4));

        iBit:=iBit-5;
        if(iBit<0)then
        begin
            iBit:=iBit+8;
            szDst:=szDst+Chr(iLast);
            iLast:=(iValue and ($FF shr(iBit+1)))shl(iBit+1);
        end;
    end;
    result:=szDst;
end;


end.
 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -