Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Teil eines PChar in Integer umwandeln (https://www.delphipraxis.net/188674-teil-eines-pchar-integer-umwandeln.html)

Kostas 27. Mär 2016 18:13

Teil eines PChar in Integer umwandeln
 
Hallo Zusammen,

Delphi-Quellcode:
RcvdHeaderSize := 28;
GetMem(RcvdHeader, RcvdHeaderSize);
ich empfange über TCP ein Paket mit einer Länge von 28 Bytes die in einer PChar Variable RcvdHeader abgelegt werden.
Die letzten 4 Bytes sind die Länge des nächsten Paketes in BigEndian z.B.: 0x80 0x25 0x00 0x00 für die Länge 9600.

Wie lassen sich bitte die vier letzten Bytes relativ schnell in integer umwandeln da die Daten weiter fliesen.

Gruß Kostas

Zacherl 27. Mär 2016 20:16

AW: Teil eines PChar in Integer umwandeln
 
Delphi-Quellcode:
PInteger(PByte(RcvdHeader) + 24)^
Endian-ess umwandeln kannst du danach mit einer der hier vorgeschlagenen Lösungen machen:
http://stackoverflow.com/questions/3...numbers-delphi

p80286 27. Mär 2016 20:23

AW: Teil eines PChar in Integer umwandeln
 
Am einfachsten wäre ein record
Delphi-Quellcode:
tmyrecord = packed record
  text : Array [1..24] of char;
  lange : Integer;
end;
Ich halte es allerdings für sehr ungewöhnlich, daß eine Längenangabe Teil eines pchar sein soll.

Gruß
K-H

Zacherl 27. Mär 2016 20:29

AW: Teil eines PChar in Integer umwandeln
 
Zitat:

Zitat von p80286 (Beitrag 1333946)
Ich halte es allerdings für sehr ungewöhnlich, daß eine Längenangabe Teil eines pchar sein soll.

PChar nimmt er ja nur als Buffer. Ist relativ weit verbreitet diese Vorgehensweise .. wobei ich persönlich hierfür auch eher ein untypisiertes
Delphi-Quellcode:
Pointer
bevorzuge.

Kostas 27. Mär 2016 20:52

AW: Teil eines PChar in Integer umwandeln
 
Zitat:

Zitat von Zacherl (Beitrag 1333945)
Delphi-Quellcode:
PInteger(PByte(RcvdHeader) + 24)^
Endian-ess umwandeln kannst du danach mit einer der hier vorgeschlagenen Lösungen machen:
http://stackoverflow.com/questions/3...numbers-delphi

Hallo Zacherl,

ich habe versucht dein Vorschlag umzusetzen, doch leider bekomme ich einen
Felher "Operator ist für den Operantentyp nicht anwendbar"

Delphi-Quellcode:

function Swap4(n: Cardinal): Cardinal;
asm
   bswap eax
end;


function GetNextLength(aRcvdBuf:PChar; aRcvdSize:integer):integer;
begin
  result := 0;

  if aRcvdSize>4 then
  begin
    result := PInteger(PByte(aRcvdBuf) + aRcvdSize-4)^; <<< Operator ist für den Operantentyp nicht anwendbar.
    result := Swap4(result);
  end;
end;

Herzlichen Dank für die Hilfe.

Neutral General 27. Mär 2016 20:59

AW: Teil eines PChar in Integer umwandeln
 
So müsste es gehn

Delphi-Quellcode:
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit

Kostas 27. Mär 2016 21:13

AW: Teil eines PChar in Integer umwandeln
 
Ihr seit große Klasse, es funktioniert einwandfrei.

Ich habe das ganze Jahr nichts mit Pointern zu tun.
Herzlichen Dank nochmal an alle.

Einen schönen Abend noch
Gruß Kostas

Zacherl 27. Mär 2016 21:22

AW: Teil eines PChar in Integer umwandeln
 
Zitat:

Zitat von Neutral General (Beitrag 1333949)
Delphi-Quellcode:
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit

Nicht machen :mrgreen: Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit
Delphi-Quellcode:
PByte()
casten.
Delphi-Quellcode:
NativeUInt
sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit
Delphi-Quellcode:
Result := PInteger(PByte(aRcvdBuf) + (aRcvdSize - 4))^

Neutral General 27. Mär 2016 21:26

AW: Teil eines PChar in Integer umwandeln
 
Zitat:

Zitat von Zacherl (Beitrag 1333952)
Zitat:

Zitat von Neutral General (Beitrag 1333949)
Delphi-Quellcode:
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit

Nicht machen :mrgreen: Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit
Delphi-Quellcode:
PByte()
casten.
Delphi-Quellcode:
NativeUInt
sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit
Delphi-Quellcode:
Result := PInteger(PByte(aRcvdBuf) + (aRcvdSize - 4))^

PByte geht aber nicht wenn die Zeigerarithmetik ausgeschaltet ist, und das ist sie standardmäßig und bei ihm scheinbar auch.

Kostas 27. Mär 2016 21:50

AW: Teil eines PChar in Integer umwandeln
 
Zitat:

Zitat von Zacherl (Beitrag 1333952)
Zitat:

Zitat von Neutral General (Beitrag 1333949)
Delphi-Quellcode:
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit

Nicht machen :mrgreen: Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit
Delphi-Quellcode:
PByte()
casten.
Delphi-Quellcode:
NativeUInt
sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit
Delphi-Quellcode:
Result := PInteger(PByte(aRcvdBuf) + (aRcvdSize - 4))^

Hi,
funktioniert leider nicht, zumindest nicht mit Delphi5 (nicht XE5) ist für ein altes Projekt.
Hingegen mit Cardinal schon. Für mich ist das völlig ausreichend.

Bitte noch eines, wie kann ich aus dem gleichen Buffer einen bestimmten Bereich in ein String schreiben?
In der Hilfe über String-Verarbeitung (nullterminiert) suche ich nach etwas wie copy aber das gibt es nicht.


Alle Zeitangaben in WEZ +1. Es ist jetzt 00:48 Uhr.
Seite 1 von 2  1 2      

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