Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?) (https://www.delphipraxis.net/177122-suche-die-tbytebuffer-klasse-aus-sysutils-ab-xe-3-a.html)

himitsu 18. Okt 2013 13:06

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Zitat:

Delphi-Quellcode:
SetLength(bytes,Length(AData));
bytes := BytesOf(AData);

Das SetLength ist sinnlos, da BytesOf ein "vollständiges" dynamisches Array zurückgibt und damit das reservierte Array (der Speicher) von SetLength somit wieder freigegeben.

Beim TMemoryStream oder TBytesStream kann man auch direkt auf den Speicher zugreifen, weswegen man da eigentlich den temp_buffer weglassen könnte.


Delphi-Quellcode:
DataStream.Size := StreamLength;
StreamPosition := 0;
//Received := Client.ReceiveBuf(DataStream.Memory^, StreamLength); // ReceiveBuf wartet nicht bis alles eingetroffen ist, sondern bricht am Ende der Datenpackete ab.
while StreamPosition < StreamLength do begin
  Received := Client.ReceiveBuf(PByte(DataStream.Memory)[StreamPosition], StreamLength - StreamPosition);
  if Received = SOCKET_ERROR then
    Break;
  Inc(StreamPosition, Received);
end;
(aus http://www.delphipraxis.net/176863-b...ml#post1231969)

Statt StreamPosition kann man auch DataStream.Position verwenden, aber ihr wollt nicht wissen wie grauenhaft diesbezüglich der der TMemoryStream implementiert ist,
aber im Normalfall sollte es oftmals nicht groß auffallen.
Delphi-Quellcode:
DataStream.Size := ...;
DataStream.Position := 0;
while DataStream.Position < DataStream.Size do begin
  Received := Client.ReceiveBuf(PByte(DataStream.Memory)[DataStream.Position], DataStream.Size - DataStream.Position);
  if Received = SOCKET_ERROR then
    Break;
  DataStream.Position := DataStream.Position + Received;
end;

jaenicke 18. Okt 2013 13:40

AW: Suche die TByteBuffer Klasse aus SysUtils ab XE 3 (?)
 
Zitat:

Zitat von himitsu (Beitrag 1232429)
Statt StreamPosition kann man auch DataStream.Position verwenden, aber ihr wollt nicht wissen wie grauenhaft diesbezüglich der der TMemoryStream implementiert ist,
aber im Normalfall sollte es oftmals nicht groß auffallen.

Was meinst du? Das sieht für mich eigentlich gut aus:
Delphi-Quellcode:
function TStream.GetPosition: Int64;
begin
  Result := Seek(0, soCurrent);
end;

function TCustomMemoryStream.Seek(const Offset: Int64; Origin: TSeekOrigin): Int64;
begin
  case Origin of
    soBeginning: FPosition := Offset;
    soCurrent: Inc(FPosition, Offset);
    soEnd: FPosition := FSize + Offset;
  end;
  Result := FPosition;
end;
Sprich für die Abfrage der Position wird die Position mit Inc um 0 erhöht (Seek weiß ja nicht, dass das unnötig ist), und dann die Position direkt zurückgeliefert. Wie sollte das sonst passieren, als auf diesem Standardweg für TStream-Nachfahren?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:18 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz