Skip to content

Instantly share code, notes, and snippets.

@freeonterminate
Created October 27, 2017 06:30
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save freeonterminate/dc89e0ac5e7817d0be6887e6f8c90d60 to your computer and use it in GitHub Desktop.
Save freeonterminate/dc89e0ac5e7817d0be6887e6f8c90d60 to your computer and use it in GitHub Desktop.
Base64 Encode
(*
* 概要 Base64 にエンコード
* 引数 iSrc エンコードしたいストリーム
* iDest エンコード結果格納先
* iSepCount セパレータを入れる場所(32 なら 32 個エンコードした所で入る)
* iSep セパレータ
*)
procedure EncodeBase64(
const iSrc, iDest: TStream;
iSepCount: Integer = 0;
const iSep: String = sLineBreak);
var
Buff: Cardinal;
Buff2: Cardinal;
Count: Integer;
SepCount: Integer;
begin
asm
// 改行位置
mov eax, iSepCount
shr eax, 2
mov iSepCount, eax
mov SepCount, eax
@@Loop:
xor eax, eax
mov Buff, eax
mov Buff2, eax
// データ読み込み
mov eax, iSrc
mov ebx, [eax]
lea edx, Buff
mov ecx, 3
call [ebx + VMTOFFSET TStream.Read]
inc eax
mov Count, eax
cmp eax, 2
jc @@4
//
xor ebx, ebx
mov edx, [Buff]
bswap edx
mov ecx, 4
@@1:
xor eax, eax
shld eax, edx, 6
shl edx, 6
mov al, [eax + GBaseEncodeTable]
sub Count, 1
jnc @@2
mov eax, CBasePadding
mov Count, 0
@@2:
shrd ebx, eax, 8
dec ecx
jnz @@1
// データ書き込み
lea edx, Buff2
mov [edx], ebx
mov ecx, 4
mov eax, iDest
mov ebx, [eax]
call [ebx + VMTOFFSET TStream.Write]
mov eax, iSepCount
test eax, eax
jz @@3
dec SepCount
jnz @@3
// 改行書き込み
mov SepCount, eax
mov eax, iDest
lea edx, iSep
mov edx, [edx]
mov ecx, [edx - 4]
mov ebx, [eax]
call [ebx + VMTOFFSET TStream.Write]
@@3:
jmp @@Loop
@@4:
mov eax, iSepCount
test eax, eax
jz @@5
cmp eax, SepCount
jz @@5
// 改行書き込み
mov eax, iDest
lea edx, iSep
mov edx, [edx]
mov ecx, [edx - 4]
mov ebx, [eax]
call [ebx + VMTOFFSET TStream.Write]
@@5:
end;
end;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment