program ideone;
uses sysutils, classes;

procedure WriteString(stream : TStream; s : AnsiString);
var
    len: Cardinal;
begin
    len := Length(s);
    stream.Write(len, sizeof(cardinal));
    if len > 0 then
        stream.Write(s[1], len);
end;

function ReadString(stream : TStream) : AnsiString;
var
    len: Cardinal;
begin
    stream.Read(len, sizeof(cardinal));
    SetLength(ReadString, len);
    if len > 0 then
        stream.Read(ReadString[1], len);
end;

procedure HexDump(p: Pointer; size: Cardinal);
type
    ByteArray = array of Byte;
var
    i: Integer;
    b: ByteArray;
begin
    b := p;
    for i := 0 to size-1 do
    begin
        if (i <> 0) and ((i mod 16) = 0) then
            WriteLn;
        Write(IntToHex(b[i], 2), ' ');
    end;
    WriteLn;
end;

var
    stream: TMemoryStream;
    i:Integer;
begin
    stream := TMemoryStream.Create;
    WriteString(stream, 'Hui');
    WriteString(stream, 'Pizda');
    WriteString(stream, '');
    WriteString(stream, 'Djigurda');
    
    HexDump(stream.Memory, stream.Size);

    stream.Seek(0, soBeginning);
    
    writeln('''', ReadString(stream) , '''');
    writeln('''', ReadString(stream) , '''');
    writeln('''', ReadString(stream) , '''');
    writeln('''', ReadString(stream) , '''');
end.