2012-04-20 3 views
1

Можете ли вы рассказать мне, как я могу это сделать? Есть ли какой-нибудь блок Freepascal, который может сделать это для меня? Мне нужно, чтобы моя программа могла хранить двоичные данные в XML-формате fileformat.Как закодировать файл любого типа в строку base64, а затем снова декодировать его в файл с помощью Lazarus/Delphi?

+0

Возможный дубликат [binary-to-base64-delphi] (http: // stackoverflow. com/questions/5795263/binary-to-base64-delphi/5795440 # 5795440) –

+0

@Uwe Этот модуль доступен в FPC? –

+0

@ Давид, так как у меня нет Лазаря, я не знаю. Вот почему я написал _possible_. –

ответ

9

Используйте блок base64 и его два класса, TBase64EncodingStream и TBase64DecodingStream.

Вот simple example:

program demo; 

uses Classes, base64; 

var 
    DecodedStream: TStringStream; 
    EncodedStream: TStringStream; 
    Encoder: TBase64EncodingStream; 
    Output: string; 
begin 
    DecodedStream := TStringStream.Create('Hello World!'); 
    EncodedStream := TStringStream.Create(''); 
    Encoder  := TBase64EncodingStream.Create(EncodedStream); 
    Encoder.CopyFrom(DecodedStream, DecodedStream.Size); 

    Output := EncodedStream.DataString; 
    { Outputs 'SGVsbG8gV29ybGQh' } 
    WriteLn(Output); 

    DecodedStream.Free; 
    EncodedStream.Free; 
    Encoder.Free; 
end. 

И, в opposite direction:

program demo; 

uses Classes, base64; 

var 
    DecodedStream: TStringStream; 
    EncodedStream: TStringStream; 
    Decoder: TBase64DecodingStream; 
    Output: string; 
begin 
    EncodedStream := TStringStream.Create('SGVsbG8gV29ybGQh'); 
    DecodedStream := TStringStream.Create(''); 
    Decoder  := TBase64DecodingStream.Create(EncodedStream); 
    DecodedStream.CopyFrom(Decoder, Decoder.Size); 

    Output := DecodedStream.DataString; 
    { Outputs 'Hello World!' } 
    WriteLn(Output); 

    DecodedStream.Free; 
    EncodedStream.Free; 
    Decoder.Free; 
end. 

или encodestringbase64 и сокращения от decodestringbase64 (2.4.4+) для не потока на основе использования:

Uses Base64; 
var 
    s : AnsiString; 
Begin 
    s:=EncodeStringBase64('Hello world!'); 
    Writeln('Encoded : ',s); 
    s:=DecodeStringBase64(s); 
    Writeln('Decoded again : ',s);  
end. 
+0

Будет ли он работать с TFileStream? –

+1

Да, он будет работать с любой формой потока. На самом деле это смысл создания потока. –

+0

Btw Начиная с версии 2.4.4, в этом блоке также есть несколько простых вспомогательных функций, которые упрощают использование обтекания потоков. –

Смежные вопросы