📄 base32.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 + -