AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

packed record in Array of Byte umwandeln

Ein Thema von Mossi · begonnen am 7. Sep 2012 · letzter Beitrag vom 7. Sep 2012
Antwort Antwort
Mossi

Registriert seit: 6. Feb 2004
Ort: Wenzenbach
35 Beiträge
 
Delphi 7 Enterprise
 
#1

packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:04
Delphi-Version: 7
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.
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?
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:13
Deine Array of Byte ist eine Dynamische Struktur. D.H. in dem Record existiert nur ein Pointer auf die Daten. du solltest ein Array [0..x] of Byte nutzen.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:39
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
Klaus
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#4

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:39
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...

Geändert von Namenloser ( 7. Sep 2012 um 11:42 Uhr)
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:40
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#6

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:50
@Klaus01

wieso ? Länge schreiben, Daten schreiben ...
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
Mossi

Registriert seit: 6. Feb 2004
Ort: Wenzenbach
35 Beiträge
 
Delphi 7 Enterprise
 
#7

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 11:55
Danke... da hätt ich auch darauf kommen können

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;
  Mit Zitat antworten Zitat
Klaus01
Online

Registriert seit: 30. Nov 2005
Ort: München
5.767 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: packed record in Array of Byte umwandeln

  Alt 7. Sep 2012, 12:15
@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
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:50 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