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/)
-   -   Integer lesen, wie in C (https://www.delphipraxis.net/46680-integer-lesen-wie-c.html)

SebE 29. Mai 2005 18:54


Integer lesen, wie in C
 
Hallo,
kann man in Delphi/Pascal einen Integer byte-weise auslesen, wie in C/C++ ?

Beispiel: int[2] -> liest das 2te Byte aus dem Integer.
Weiß jemand, wie man das machen könnte?

Dankeschön für eure Unterstützung.

Tubos 29. Mai 2005 19:09

Re: Integer lesen, wie in C
 
Zitat:

Beispiel: int[2] -> liest das 2te Byte aus dem Integer.
Das funktioniert in C++ aber nicht so!
Ganz abgesehen davon dass der Index bei 0 beginnt (das zweite Byte wäre also Index 1)...

Folgendes:
Code:
int i;
unsigned char ZweitesByte=i[1];
liefert einen Compiler Fehler.
Wenn du das hier meinst:
Code:
int *i;
int zahl=5;
i=&zahl;
unsigned char ZweitesByte=i[1];
so lässt sich das zwar kompilieren, aber in ZweitesByte steht danach nicht das zweite Byte drinnen sondern das fünfte weil die Größe des Integers (4 Byte) mit der Indexnummer multipliziert wird! Integer hat aber nur 4 Byte, sodass das fünfte Byte irgendwas von deinem Programm ist, was eben danach im RAM steht.
Willst du eine Zahl byteweise auslesen, so lässt sich das in C++ mit einem union lösen, das sowohl einen int-wert als auch ein Array von 4 char-Werten enthält. Möglicherweise gibts das in Delphi auch.


(Bitte um Korrektur falls da irgendwas nicht stimmt ;) )

Dax 29. Mai 2005 19:13

Re: Integer lesen, wie in C
 
In Delphi ginge das zum Bleistift so ;)
Delphi-Quellcode:
type
  TByteFromInt = record
    case Byte of
      0: (Int: Integer);
      1: (Bytes: array[1..4] of Byte);
  end;

marabu 29. Mai 2005 19:26

Re: Integer lesen, wie in C
 
Weitere Möglichkeiten, um auf Teile einer Integer zuzugreifen:

Delphi-Quellcode:
var
  i, j: integer;
  b: byte;
  pb: PByte;
begin
  b := LoByte(HiWord(i));

  for j := 0 to 3 do
    b := i shr (j * 8) and $FF;

  pb := @i;
  for j := 0 to 3 do begin
    b := pb^;
    Inc(pb);
  end;
end;
Grüße vom marabu

SebE 29. Mai 2005 19:50

Re: Integer lesen, wie in C
 
@Tubos:
Stimmt ja. Ich kenn mich in C nicht aus, hab des nur mal gesehen. :stupid:

@Dax:
Dein Code sieht interessant aus, aber ich kann mit dem Case in einem Typ nix anfangen :?

Ich werd's mal ausprobieren.

Danke für die Codes

Chewie 29. Mai 2005 20:37

Re: Integer lesen, wie in C
 
Zitat:

Zitat von Tubos
Folgendes:
Code:
int i;
unsigned char ZweitesByte=i[1];
liefert einen Compiler Fehler.
Wenn du das hier meinst:
Code:
int *i;
int zahl=5;
i=&zahl;
unsigned char ZweitesByte=i[1];
so lässt sich das zwar kompilieren, aber in ZweitesByte steht danach nicht das zweite Byte drinnen sondern das fünfte weil die Größe des Integers (4 Byte) mit der Indexnummer multipliziert wird! Integer hat aber nur 4 Byte, sodass das fünfte Byte irgendwas von deinem Programm ist, was eben danach im RAM steht.
Willst du eine Zahl byteweise auslesen, so lässt sich das in C++ mit einem union lösen, das sowohl einen int-wert als auch ein Array von 4 char-Werten enthält. Möglicherweise gibts das in Delphi auch.


(Bitte um Korrektur falls da irgendwas nicht stimmt ;) )

Das ganze würde hier funktionieren, wenn i ein char* wäre. Evtl. wäre da noch ein Typecast nötig, aber mit i[1] würde dann das 2. Byte indiziert werden.

Christian Seehase 29. Mai 2005 21:02

Re: Integer lesen, wie in C
 
Moin Sebastian,

zum Thema case in einem Record kannst Du mal in der Hilfe unter Varianten-Records nachschauen.

alzaimar 29. Mai 2005 21:15

Re: Integer lesen, wie in C
 
Oder so;
Delphi-Quellcode:
Var
  X : Integer;
  p : PByteArray;

Begin
  p := @X; // p zeigt auf ein Byte-Array. @X ist die Adresse der Variablen X, also zeigt p auf X.
  // Zugriff auf die Bytes of X über p^[0]..p^[3].. Aber Achtung! Intel ist pervers! Achte auf die Reihenfolge der bytes.
Oder, richtig 'dreckig'
Delphi-Quellcode:
Var
  X : Integer;
  B : Array [0..3] Of Byte absolute X;

Begin
  // Delphi kompiliert das so, das B und X den gleichen Speicherbereich belegen.
  // Zugriff über B[0]..B[3]
Ein einfaches Typcasting sollte es auch tun, also sowas:
Delphi-Quellcode:
Type
  TIntAsBytes = Array [0..3] of Byte;

Var
  X : Integer;

Begin
  // Zugriff auf die Bytes von X über TIntAsBytes(X)[0] ... TIntAsBytes(X)[3]

SebE 29. Mai 2005 21:23

Re: Integer lesen, wie in C
 
boah, das ist natürlich nicht schlecht.

Wieder was gelernt, irgendwie wird mir diese Programmiersprache immer sympatischer. :love:

SebE 30. Mai 2005 19:09

Re: Integer lesen, wie in C
 
So hab das Prinzip verstanden.
Aber kann man das mit den Records auch mit einem AnsiString machen?

Beispiel:
Delphi-Quellcode:
Record
  case Byte of
  0: (s: Ansistring);
  1: ...
  end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:49 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