Base64 — стандарт кодирования двоичных данных при помощи только 64 символов ASCII. Алфавит кодирования содержит латинские символы A-Z, a-z, цифры 0-9 (всего 62 знака) и 2 дополнительных символа, зависящих от системы реализации. Каждые 3 исходных байта кодируются 4-мя символами (увеличение на ¹⁄₃).
Среда: Delphi 10.2 Tokyo
- File_As_StrBase64 — Конвертировать двоичный файл в строку Base64.
- StrBase64_As_File — Создать двоичный файл из строки Base64.
- File_LoadFrom_Base64 — Создать двоичный файл из файла в формате Base64.
- File_SaveTo_Base64 — Создать файл формата Base64 из двоичного файла.
- FileSize_Int64 — Вспомогательная (возвращает размер заданного файла).
См., также, текст всех функций (html-формат).
03.12.2022 — Есть некоторые исправления (см. здесь) по принципу «война план покажет»…
Ссылку на файл ZIP-архива с примером — см. в конце этого документа.
Uses ... System.Classes, System.NetEncoding, System.SysUtils; function File_As_StrBase64(fnIN:string): string; //Конвертировать двоичный файл в строку Base64 //fnIN - полное имя бинарного файла //Возвращаемое значение - строка Base64 Var FileStream: TFileStream; Output: TStringStream; Encoding: TBase64Encoding; begin Result:=''; fnIN:=trim(fnIN); if FileExists(fnIN) then begin FileStream := TFileStream.Create(fnIn, fmShareDenyNone {fmCreate}); try FileStream.Seek(0,soFromBeginning); Output:= TStringStream.Create('', TEncoding.ASCII); TRY Encoding:= TBase64Encoding.Create(0); TRY Encoding.Encode(FileStream, Output); Result:= Output.DataString; FINALLY Encoding.Free; END; FINALLY Output.Free; END; finally FileStream.Free; end; end; end;
Uses ... System.Classes, System.NetEncoding, System.SysUtils; function StrBase64_As_File(fnOUT:string; S:String; YesRewrite:boolean=false): boolean; //Создать двоичный файл из строки Base64 //fnOUT - имя результирующего (создаваемого), двоичного файла //S - строка Base64 //YesRewrite - флаг. Если =TRUE, то файл с именем fnOUT перезапишется (если уже существует). В противном случае новый файл создан НЕ будет. //Возвращаемое значение: результат операции ( =TRUE - успешно). Var Yes:boolean; Input: TStringStream; FileStream: TFileStream; Encoding: TBase64Encoding; begin Result:=false; Yes:=false; if S<>'' then begin fnOUT:=trim(fnOUT); if fnOUT<>'' then begin Yes:=true; if not YesRewrite then begin if FileExists(fnOUT) then Yes:=false; end else begin System.SysUtils.DeleteFile(fnOUT); end; end; end; if Yes then begin Input:= TStringStream.Create(S, TEncoding.ASCII); TRY FileStream := TFileStream.Create(fnOut, fmCreate); TRY Input.Position:=0; Encoding:= TBase64Encoding.Create(0); TRY Encoding.Decode(Input, FileStream); FileStream.Position:=0; //if FileSize_Int64(fnOUT)>0 then begin //не факт (03.12.2022) Result:=true; //end; FINALLY Encoding.Free; END; FINALLY FileStream.Free; END; FINALLY Input.Free; END; end; end;
Uses ... System.Classes, System.NetEncoding, System.SysUtils; function File_LoadFrom_Base64(fnIn64:string; fnOut:string; YesRewrite:boolean=false): boolean; //Создать двоичный файл из файла в формате Base64 //fnIn64 - имя исходного файла в формате Base64. //fnOut - имя создаваемого двоичного файла. //YesRewrite - флаг. Если =TRUE, то файл с именем fnOUT перезапишется (если уже существует). В противном случае новый файл создан НЕ будет. //Возвращаемое значение: результат операции ( =TRUE - успешно). Var Yes:boolean; List64:TStrings; s64:string; begin Result:=false; Result:=false; Yes:=false; fnIn64:=trim(fnIn64); if FileExists(fnIn64) then begin fnOut:=trim(fnOut); if fnOut<>'' then begin Yes:=true; if not YesRewrite then begin if FileExists(fnOut) then Yes:=false; end else begin System.SysUtils.DeleteFile(fnOut); end; end; end; if Yes then begin List64:=TStringList.Create; TRY List64.LoadFromFile(fnIn64); S64:=List64.Text; if S64<>'' then begin Result:=StrBase64_As_File(fnOut, s64); end; FINALLY FreeAndNil(List64); END; end; end;
Uses ... System.Classes, System.NetEncoding, System.SysUtils; function File_SaveTo_Base64(fnIN:string; fnOut64:string; YesRewrite:boolean=false): boolean; //Создать файл формата Base64 из двоичного файла //fnIN - имя исходного, двоичного файла //fnOut64 - имя создаваемого файла Base64 //YesRewrite - флаг. Если =TRUE, то файл с именем fnOut64 перезапишется (если уже существует). В противном случае новый файл создан НЕ будет. //Возвращаемое значение: результат операции ( =TRUE - успешно). Var Yes:boolean; List64:TStrings; s64:string; begin Result:=false; Yes:=false; fnIN:=trim(fnIN); if FileExists(fnIn) then begin fnOut64:=trim(fnOut64); if fnOut64<>'' then begin Yes:=true; if not YesRewrite then begin if FileExists(fnOut64) then Yes:=false; end else begin System.SysUtils.DeleteFile(fnOut64); end; end; end; if Yes then begin s64:=File_As_StrBase64(fnIN); if S64<>'' then begin List64:=TStringList.Create; TRY List64.Text:=S64; List64.SaveToFile(fnOut64); Result:=true; FINALLY FreeAndNil(List64); END; end; end; end;
Uses ... System.SysUtils; function FileSize_Int64(fn : string) : int64; //Вспомогательная (возвращает размер заданного файла с именем fn) Var SearchRec: TSearchRec; begin Result:=-1; fn:=(fn); if length(fn)>0 then begin if FileExists(fn) then begin if System.SysUtils.FindFirst(fn, faAnyFile, SearchRec) = 0 then begin Result:=SearchRec.Size; end; System.SysUtils.FindClose(SearchRec); end; end; end;
Иллюстрирующий пример (исходники, проект в среде Delphi 10.2 Tokyo).
Имя файла ZIP-архива: base64.zip (скачать).
См., также, текст всех функций (html-формат).
03.12.2022 — в исходниках (см. файл-архив выше) есть некоторые исправления (в соответствии с StrBase64_As_File).
Дата: 22.02.2024