![]() |
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:
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.
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; So. Jetzt muss ich diesen Record (nachricht: TMessage) aber per Tcp versenden.
Delphi-Quellcode:
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.
client.WriteBuffer(nachricht, sizeof(nachricht), true)
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:
Was ist jetzt hier schief gelaufen und wie macht man das richtig?
sizeof(nachricht.message); // -> 4
length(nachricht.message); // -> 9 |
AW: packed record in Array of Byte umwandeln
Deine
Delphi-Quellcode:
ist eine Dynamische Struktur. D.H. in dem Record existiert nur ein Pointer auf die Daten. du solltest ein
Array of Byte
Delphi-Quellcode:
nutzen.
Array [0..x] of Byte
Gruß K-H |
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 |
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... |
AW: packed record in Array of Byte umwandeln
Zitat:
Grüße Klaus |
AW: packed record in Array of Byte umwandeln
@Klaus01
wieso ? Länge schreiben, Daten schreiben ... |
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; |
AW: packed record in Array of Byte umwandeln
Zitat:
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 00:11 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz