X-Git-Url: http://deadsoftware.ru/gitweb?a=blobdiff_plain;f=src%2Fshared%2FBinEditor.pas;h=25526e14c0374b5ac3de55ff639872625d34d5a4;hb=2fa77a7c9667395ef6d4141cde69ff6349bf301e;hp=1f53456f23d6a009e21d136c418c4aff19ab7555;hpb=464487c1d25e23004bbd30a1246f54561f584943;p=d2df-sdl.git diff --git a/src/shared/BinEditor.pas b/src/shared/BinEditor.pas index 1f53456..25526e1 100644 --- a/src/shared/BinEditor.pas +++ b/src/shared/BinEditor.pas @@ -44,7 +44,7 @@ Type Procedure WriteInt(Var x: Integer); Procedure WriteSingle(Var x: Single); Procedure WriteBoolean(Var x: Boolean); - Procedure WriteString(Var x: String; aMaxLen: Byte = 255); + Procedure WriteString(const x: AnsiString; aMaxLen: Word=65535); Procedure WriteMemory(Var x: Pointer; memSize: Cardinal); Procedure Fill(aLen: Cardinal; aFillSym: Byte); Procedure SaveToFile(Var aFile: File); @@ -70,7 +70,7 @@ Type Procedure ReadInt(Var x: Integer); Procedure ReadSingle(Var x: Single); Procedure ReadBoolean(Var x: Boolean); - Procedure ReadString(Var x: String); + Procedure ReadString(Var x: AnsiString); Procedure ReadMemory(Var x: Pointer; Var memSize: Cardinal); Procedure Skip(aLen: Cardinal); Procedure LoadFromFile(Var aFile: File); @@ -245,26 +245,22 @@ begin WriteVar(y, SizeOf(Byte)); end; -Procedure TBinMemoryWriter.WriteString(Var x: String; aMaxLen: Byte = 255); +Procedure TBinMemoryWriter.WriteString (const x: AnsiString; aMaxLen: Word=65535); var - len: Byte; - + len: Word; begin - len := Min(Length(x), aMaxLen); + if (Length(x) > aMaxLen) then len := aMaxLen else len := Word(Length(x)); - if (FPosition + SizeOf(Byte) + len) > FSize then - ExtendMemory(SizeOf(Byte) + len); + if (FPosition+SizeOf(Byte)+len) > FSize then ExtendMemory(SizeOf(Byte)+len); -// Äëèíà ñòðîêè: - CopyMemory(Pointer(NativeUInt(FData) + FPosition), - @len, SizeOf(Byte)); - FPosition := FPosition + SizeOf(Byte); -// Ñòðîêà: - if len > 0 then + // Äëèíà ñòðîêè: + CopyMemory(Pointer(NativeUInt(FData)+FPosition), @len, SizeOf(len)); + FPosition := FPosition+SizeOf(len); + // Ñòðîêà: + if (len > 0) then begin - CopyMemory(Pointer(NativeUInt(FData) + FPosition), - @x[1], len); - FPosition := FPosition + len; + CopyMemory(Pointer(NativeUInt(FData) + FPosition), @x[1], len); + FPosition := FPosition+len; end; end; @@ -410,38 +406,39 @@ begin x := False; end; -Procedure TBinMemoryReader.ReadString(Var x: String); +Procedure TBinMemoryReader.ReadString (Var x: AnsiString); var - len: Byte; - + len: Word; begin - if (FPosition + SizeOf(Byte)) <= FSize then - begin + if (FPosition+SizeOf(len)) <= FSize then + begin // Äëèíà ñòðîêè: - CopyMemory(@len, - Pointer(NativeUInt(FData) + FPosition), - SizeOf(Byte)); - - if (FPosition + SizeOf(Byte) + len) <= FSize then - begin - FPosition := FPosition + SizeOf(Byte); - // Ñòðîêà: - SetLength(x, len); - if len > 0 then - begin - CopyMemory(@x[1], - Pointer(NativeUInt(FData) + FPosition), - len); - FPosition := FPosition + len; - end - else - x := ''; - end + CopyMemory(@len, Pointer(NativeUInt(FData)+FPosition), SizeOf(len)); + if (FPosition+SizeOf(len)+len <= FSize) then + begin + FPosition := FPosition+SizeOf(len); + // Ñòðîêà: + UniqueString(x); + SetLength(x, len); + if (len > 0) then + begin + CopyMemory(@x[1], Pointer(NativeUInt(FData) + FPosition), len); + FPosition := FPosition+len; + end else - raise EBinSizeError.Create('TBinMemoryReader.ReadString: Too Long String'); + begin + x := ''; + end; end + else + begin + raise EBinSizeError.Create('TBinMemoryReader.ReadString: Too Long String'); + end; + end else + begin raise EBinSizeError.Create('TBinMemoryReader.ReadString: End of Memory'); + end; end; Procedure TBinMemoryReader.ReadMemory(Var x: Pointer; Var memSize: Cardinal);