AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Teil eines PChar in Integer umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Teil eines PChar in Integer umwandeln

Ein Thema von Kostas · begonnen am 27. Mär 2016 · letzter Beitrag vom 27. Mär 2016
Antwort Antwort
Seite 1 von 2  1 2      
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#1

Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 19:13
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#2

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 21:16
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
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 21:23
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
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#4

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 21:29
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 Pointer bevorzuge.
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 21:52
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.
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#6

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 21:59
So müsste es gehn

result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."

Geändert von Neutral General (27. Mär 2016 um 22:20 Uhr)
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#7

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 22:13
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
  Mit Zitat antworten Zitat
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#8

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 22:22
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit
Nicht machen Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit PByte() casten. NativeUInt sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit Result := PInteger(PByte(aRcvdBuf) + (aRcvdSize - 4))^
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
Benutzerbild von Neutral General
Neutral General

Registriert seit: 16. Jan 2004
Ort: Bendorf
5.219 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#9

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 22:26
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit
Nicht machen Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit PByte() casten. NativeUInt sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit 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.
Michael
"Programmers talk about software development on weekends, vacations, and over meals not because they lack imagination,
but because their imagination reveals worlds that others cannot see."
  Mit Zitat antworten Zitat
Kostas

Registriert seit: 14. Mai 2003
Ort: Gerstrhofen
1.095 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Teil eines PChar in Integer umwandeln

  Alt 27. Mär 2016, 22:50
result := PInteger(Cardinal(aRcvdBuf) + aRcvdSize-4)^; // statt Integer musst du ggf. NativeUInt benutzen bei 64-Bit
Nicht machen Wenn man plattformunabhängig bleiben will, sollte man auf jeden Fall mit PByte() casten. NativeUInt sollte auch funktionieren, aber die PByte Variante ist empfohlen.

Probiers mal mit 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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:00 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