AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Object-Pascal / Delphi-Language Delphi [erledigt] Little-Endian-DWord zu Integer und zurück
Thema durchsuchen
Ansicht
Themen-Optionen

[erledigt] Little-Endian-DWord zu Integer und zurück

Ein Thema von mOfl · begonnen am 1. Sep 2008 · letzter Beitrag vom 1. Sep 2008
Antwort Antwort
mOfl

Registriert seit: 1. Jun 2006
11 Beiträge
 
#1

[erledigt] Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 07:16
(Delphi 7 Personal)

Hallo Jungens,

für ein Programm, das sich aus einem MemoryStream Größen holt, die da als Dwords im Little-Endian-Format stehen, habe ich nach einer Möglichkeit gesucht, die 4 Bytes, sobald sie in meinen Byte-Array-Puffer geladen wurden, in Integer umzuwandeln, um damit arbeiten zu können. Von Assembler wollte und will ich gänzlich die Finger lassen, weil ich keinen Schimmer davon habe. Offensichtlich ist es mit Pointern nicht anders, denn ich fand diese simple Lösung für mein Problem...

Delphi-Quellcode:
buffer: Array[0..3] of Byte;
groesse: integer;
groesse := PInteger(@buffer[0])^; ... die ich nicht verstehe Ich habe das an einem schlichten Programm getestet und es scheint wunderbar zu funktionieren, wenn ich von Hand in das Array etwas eintrage, etwa

Delphi-Quellcode:
buffer[0] := $FE;
buffer[1] := $E2;
buffer[2] := $00;
buffer[3] := $00;
dann wird das richtig umgewandelt in die Integer 58110, da es hexadezimal ja E2FE ist, ich verstehe aber nicht, was in dieser kleinen Zeile alles drin steckt. Dass PInteger ein Pointer auf Integerzahlen ist und die grobe Funktion von @ und ^ konnte ich auf einschlägigen Seiten lesen, aber wie funktioniert das zum Beispiel, dass trotz des Aufrufs von Index 0 des Arrays die ganze Zahl umgewandelt wird? Denkt die Funktion mit? =)

Die zweite Sache ist nämlich die, dass ich bestimmte Bytes verändern und dann wieder in den MemoryStream schicken möchte, und das heißt für mich: Integer bearbeiten, wieder in Little-Endian-Form bringen, in ein Byte-Array schreiben und mittels stream.WriteBuffer(buffer, 4) den entsprechenden Wert im MemoryStream überschreiben. Zusätzlich zur allgemeinen Frage also noch die Frage: Wie sieht der äußert raffinierte Befehl rückwärts aus, also von Integer zu Byte-Array oder viel primitiver gefragt - geht das überhaupt so einfach?

Würde mich über fachmännische Hilfe sehr freuen! =)

Grüßle
Dani

PS: Ich bin mir sicher, dass die Delphi Hilfe da ein paar schlaue Sachen bereit hält, aber Windows Vista meint irgendwie, alte Hilfedateien nicht mehr anzeigen zu müssen
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.540 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 07:28
Zitat:
groesse := PInteger(@buffer[0])^;
buffer[0] - Erstes Element des Array
@buffer[0] - Adresse dieses ersten Elementes
PInteger(@buffer[0]) - Es handelt sich um einen Zeiger auf Integer
PInteger(@buffer[0])^ - Wir sind nicht an dem Zeiger interessiert, sondern an den dahinterliegenden Daten (Dereferenzierung)

Ich hoffe, das bringt etwas mehr Klarheit.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#3

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 13:00
Zitat von mOfl:
PS: Ich bin mir sicher, dass die Delphi Hilfe da ein paar schlaue Sachen bereit hält, aber Windows Vista meint irgendwie, alte Hilfedateien nicht mehr anzeigen zu müssen
Das Programm zum Anzeigen der alten Hilfe-Dateien kann man sich bei MS herunterladen. Google mal nach dem Problem, da müsstest du was finden.

MfG,
Bug
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#4

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 15:06
Moin moin,
Zitat von mOfl:
...Zusätzlich zur allgemeinen Frage also noch die Frage: Wie sieht der äußert raffinierte Befehl rückwärts aus, also von Integer zu Byte-Array oder viel primitiver gefragt - geht das
überhaupt so einfach?...
Ja, es geht genau so einfach:
Delphi-Quellcode:
//..
   groesse := 439041101;
   PInteger(@buffer[0])^ := groesse;
//..
Ein Integer "besteht" ja aus 4 Bytes (SizeOf(Integer) = 4), es ist also - aus sicht des PCs - das gleiche wie ein Array[0..3] of Byte.
Ein PInteger zeigt auf das erste Byte von den 4 Bytes eines Integers. @buffer[0] zeigt ebenfalls auf das erste Byte unseres Arrays.
Wenn wir jetzt dem Compiler mitteilen, das @buffer[0] ein PInteger ist, können wir diesen ganz einfach dereferenzieren und einen Wert
zuweisen.

Was ich bei dir nur nicht verstehe, warum musst du überhaupt den Weg über ein Array[0..3] of Byte gehen? Du kannst die Werte doch direkt in einen
Integer einlesen?
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
Benutzerbild von BUG
BUG

Registriert seit: 4. Dez 2003
Ort: Cottbus
2.094 Beiträge
 
#5

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 15:16
Zitat von x000x:
Was ich bei dir nur nicht verstehe, warum musst du überhaupt den Weg über ein Array[0..3] of Byte gehen? Du kannst die Werte doch direkt in einen

Integer einlesen?
Das könnten auch das Problem sein: der PC benutzt Little-Endian (siehe hier).
Wenn du denn Wert vor dem "in den Integer schreiben" in Big-Endian umsortierst, kommt nur Grütze heraus.

MfG,
Bug
Intellekt ist das Verstehen von Wissen. Verstehen ist der wahre Pfad zu Einsicht. Einsicht ist der Schlüssel zu allem.
  Mit Zitat antworten Zitat
Benutzerbild von x000x
x000x

Registriert seit: 21. Jan 2004
Ort: Bei Hamburg
308 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 15:22
Moin moin,
Zitat von BUG:
...Wenn du denn Wert vor dem "in den Integer schreiben" in Big-Endian umsortierst, kommt nur Grütze heraus...
Davon hat er aber nix geschrieben.
Zitat von mOfl:
...für ein Programm, das sich aus einem MemoryStream Größen holt, die da als Dwords im Little-Endian-Format stehen, habe ich nach einer Möglichkeit gesucht, die 4 Bytes, sobald sie in meinen Byte-Array-Puffer geladen wurden, in Integer umzuwandeln, um damit arbeiten zu können...
Peter
-= Gruss Peter =-
-= alias x000x =-
  Mit Zitat antworten Zitat
mOfl

Registriert seit: 1. Jun 2006
11 Beiträge
 
#7

Re: Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 17:08
Zitat von x000x:
Moin moin,
Ja, es geht genau so einfach:
Delphi-Quellcode:
//..
   groesse := 439041101;
   PInteger(@buffer[0])^ := groesse;
//..
Ein Integer "besteht" ja aus 4 Bytes (SizeOf(Integer) = 4), es ist also - aus sicht des PCs - das gleiche wie ein Array[0..3] of Byte.
Ein PInteger zeigt auf das erste Byte von den 4 Bytes eines Integers. @buffer[0] zeigt ebenfalls auf das erste Byte unseres Arrays.
Wenn wir jetzt dem Compiler mitteilen, das @buffer[0] ein PInteger ist, können wir diesen ganz einfach dereferenzieren und einen Wert
zuweisen.

Was ich bei dir nur nicht verstehe, warum musst du überhaupt den Weg über ein Array[0..3] of Byte gehen? Du kannst die Werte doch direkt in einen
Integer einlesen?
Vielen Dank für die erleuchtende und weiterbringende Antwort! =) Den Weg über das Array geh ich, weil es für mich so einfacher ist, da die Werte nicht die einzigen sind, die gelesen werden. Es werden viele verschiedene Werte in ein Array eingelesen und dann bei Bedarf verarbeitet und nur bei einem bestimmten Funktionsaufruf wird wirklich ein Integer draus.
  Mit Zitat antworten Zitat
grenzgaenger
(Gast)

n/a Beiträge
 
#8

Re: [erledigt] Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 20:23
hier mal eine kleine funktion...

Delphi-Quellcode:
function BigEndian2LittleEndian(aInt: integer): integer;
asm
  xchg ah, al;
  rol eax, 16;
  xchg ah, al;
end;

aber wie du das wieder zurück bekommst
  Mit Zitat antworten Zitat
Laufi

Registriert seit: 21. Mär 2006
86 Beiträge
 
#9

Re: [erledigt] Little-Endian-DWord zu Integer und zurück

  Alt 1. Sep 2008, 21:45
Hallo!

Zitat von grenzgaenger:
aber wie du das wieder zurück bekommst
Indem man es nochmals aufruft du scherz Kecks?

Liebe Grüsse
Laufi
  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 20:15 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