Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi packed record in Array of Byte umwandeln (https://www.delphipraxis.net/170252-packed-record-array-byte-umwandeln.html)

Mossi 7. Sep 2012 10:04

Delphi-Version: 7

packed record in Array of Byte umwandeln
 
Hallo zusammen,

ich hab einen Record-Struktur, die ich als ByteArray umwandeln will, um sie dann mit IdTCPClient zu übertragen. Grundsätzlich sollte das ja auch kein Problem sein, aber aus irgendeinem Grund gehen mir ein paar Bytes verloren.

Die Struktur sieht folgendermaßen aus:
Delphi-Quellcode:
THeader = packed record
  signature: array[0..7] of Byte;
  messageType: TMessageType; // 1 Byte
  messageLength: integer;
end;
TMessage = packed record
  header: THeader;
  message: array of Byte;
end;
bei 'signature' und 'message' handelt es sich eigentlich um strings, die ich aber mit CopyMemory entsprechend umgewandelt habe. Der Inhalt dieser Arrays passt auch, wie ich gesehen habe.

So. Jetzt muss ich diesen Record (nachricht: TMessage) aber per Tcp versenden.
Delphi-Quellcode:
client.WriteBuffer(nachricht, sizeof(nachricht), true)
Am Server kommt der Header auch vollständig und lesbar an. Die message allerdings sollte eigentlich den String 'connected' enthalten. Es kommt aber nur 4 nichts sagende Bytes an.
Im Delphi-Client stehen in diesem ByteArray aber die richtigen Werte.

Aufgefallen ist mir auch noch folgendes und da liegt wohl auch das Problem:
Delphi-Quellcode:
sizeof(nachricht.message); // -> 4
length(nachricht.message); // -> 9
Was ist jetzt hier schief gelaufen und wie macht man das richtig?

p80286 7. Sep 2012 10:13

AW: packed record in Array of Byte umwandeln
 
Deine
Delphi-Quellcode:
Array of Byte
ist eine Dynamische Struktur. D.H. in dem Record existiert nur ein Pointer auf die Daten. du solltest ein
Delphi-Quellcode:
Array [0..x] of Byte
nutzen.

Gruß
K-H

Klaus01 7. Sep 2012 10:39

AW: packed record in Array of Byte umwandeln
 
Hallo,

wenn Deine Message eine variable Länge haben soll, kannst Du auch darüber nachdenken
die Message als MemoryStream zu übertragen.

Grüße
Klaus

Namenloser 7. Sep 2012 10:39

AW: packed record in Array of Byte umwandeln
 
Es gibt eigentlich keinen Grund, den Record in ein Byte-Array umzuwandeln. Nimm einfach den Record selbst als Buffer.

Edit: Ah Sorry, noch nicht ganz wach...

Klaus01 7. Sep 2012 10:40

AW: packed record in Array of Byte umwandeln
 
Zitat:

Zitat von NamenLozer (Beitrag 1181965)
Es gibt eigentlich keinen Grund, den Record in ein Byte-Array umzuwandeln. Nimm einfach den Record selbst als Buffer.

.. nur mit einem dynamischen Array als Record Element wird das auch nichts.

Grüße
Klaus

Bummi 7. Sep 2012 10:50

AW: packed record in Array of Byte umwandeln
 
@Klaus01

wieso ? Länge schreiben, Daten schreiben ...

Mossi 7. Sep 2012 10:55

AW: packed record in Array of Byte umwandeln
 
Danke... da hätt ich auch darauf kommen können :oops:

Ich hab das ganze jetzt umgebaut. Letztendlich gibt es jetzt nur noch den Record THeader. Die Nachricht selbst häng ich dann einfach an den Byte Array an.
Das ganze sieht dann so aus. Vielleicht hat ja noch jemand eine schönere Lösung, aber das sieht jetzt schon mal ganz gut und übersichtlich aus:

Delphi-Quellcode:
procedure TRemote.SendString(value: string);
var
  buffer: array of byte;
  header: THeader;
begin
  if _client.Connected then
  begin
    header := CreateHeader(ANSI, Length(value));
    Setlength(buffer, sizeof(header) + header.length);
    CopyMemory(@buffer[0], @header, sizeof(header));
    CopyMemory(@buffer[sizeof(header)], @value[1], Length(value));

    _client.WriteBuffer(buffer[0], Length(buffer), true);
  end;
end;

Klaus01 7. Sep 2012 11:15

AW: packed record in Array of Byte umwandeln
 
Zitat:

Zitat von Bummi (Beitrag 1181970)
@Klaus01

wieso ? Länge schreiben, Daten schreiben ...

Ich habe es nicht extra ausgeführt - ich bezog mich darauf den Record in einem Rutsch zu schreiben,
dann dann wäre doch nur die Adresse vom message enthalten und nicht dessen Inhalt.

Grüße
Klaus


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:48 Uhr.

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