Delphi-PRAXiS

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;

dizzy 30. Mai 2005 19:17

Re: Integer lesen, wie in C
 
Das geht imho von Hause aus, da Stings eh nichts anderes sind als Arrays.
Delphi-Quellcode:
var
  s, x: String;
begin
  x := s[1];
end;
In x steht dann das erste Zeichen von s.

sniper_w 30. Mai 2005 19:25

Re: Integer lesen, wie in C
 
In C macht man es z.b. so :
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int a;
    unsigned char *e;
   
    e = &a;
   
    scanf("%d", &a);
    printf("\n");
   
    int i;
    for(i=0;i<4;i++)
     printf("%d\n",e[i]);
 
  system("PAUSE");   
  return 0;
}

alzaimar 31. Mai 2005 17:08

Re: Integer lesen, wie in C
 
@dizzy: Du darfst Dich in Zukunft nicht mehr darauf verlassen, das ein String ein Array ist. Der Zugriff auf einzelne Zeichen per aString[aIndex] ist veraltet und sollte bedauerlicherweise nicht mehr verwendet werden. Der offizielle Weg ist über die Copy-Prozedur. Krank, nicht war? Speziell die Ansi- und WideStrings sind davon betroffen, IMHO Shortstrings, also per 'string[123]' deklarierte Variablen nicht.

Aber, so lange Du Tools schreibst, die mit der nächsten oder übernächsten Delphi-Version nicht mehr laufen sollen, ist das egal.

dizzy 1. Jun 2005 00:32

Re: Integer lesen, wie in C
 
:shock: Einen extra Funktionsaufruf dafür "verschwenden"? Selbst wenn es mit Blick auf Ansi/Unicode so gemacht ist, dann wäre ein Ansi-String ein array of Byte, und Unicode ein array of Word... Dafür erst aufwändig eine Funktion... *schüttel* :?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:35 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz