unit IngeoSysUtils;

interface
uses Classes;

{Сохраняет строку в поток. Формат: 4 байта длина строки, потом сама строка.[brd]}
	procedure SaveStringToStream(AStream: TStream; S: string);
{Считывает строку из потока. Формат: 4 байта длина строки, потом сама строка.[brd]}
	function LoadStringFromStream(AStream: TStream): string;
{Вычисляет количество байт которое будет занимать в потоке строка s при использовании
	процедуры SaveStringToStream.[vlasov]}
	function GetSaveStringSize(const s: String): Longint;

implementation

{Сохраняет строку в поток. Формат: 4 байта длина строки, потом сама строка.[brd]}
procedure SaveStringToStream(AStream: TStream; S: string);
var
	aLen: Longint;
begin
	aLen := Length(S);
	AStream.WriteBuffer(aLen, sizeof(aLen));
	if aLen > 0 then
		AStream.WriteBuffer(Pointer(S)^, aLen);
end;

function GetSaveStringSize(const s: String): Longint;
begin
	Result := sizeof(Longint) + Length(s);
end;

{Считывает строку из потока. Формат: 4 байта длина строки, потом сама строка.[brd]}
function LoadStringFromStream(AStream: TStream): string;
var
	aLen, aSkip: Longint;
begin
	AStream.ReadBuffer(aLen, sizeof(aLen));
	aSkip := 0;
{$IFNDEF WIN32}
	if aLen > 255 then begin
		aSkip := aLen-255;
		aLen := 255;
	end;
{$ENDIF}
	System.SetString(Result, nil, aLen);
	if aLen > 0 then begin
		AStream.ReadBuffer(Pointer(Result)^, aLen);
		if aSkip > 0 then
			AStream.Seek(aSkip, soFromCurrent)
	end
end;


end.