AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Integer lesen, wie in C

Ein Thema von SebE · begonnen am 29. Mai 2005 · letzter Beitrag vom 1. Jun 2005
Antwort Antwort
Seite 1 von 2  1 2      
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#1

Integer lesen, wie in C

  Alt 29. Mai 2005, 18:54
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.
Sebastian
  Mit Zitat antworten Zitat
Tubos

Registriert seit: 25. Feb 2004
Ort: Yspertal (Niederösterreich)
1.014 Beiträge
 
Delphi 7 Personal
 
#2

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 19:09
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 )
Lukas
  Mit Zitat antworten Zitat
Dax
(Gast)

n/a Beiträge
 
#3

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 19:13
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;
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#4

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 19:26
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
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#5

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 19:50
@Tubos:
Stimmt ja. Ich kenn mich in C nicht aus, hab des nur mal gesehen.

@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
Sebastian
  Mit Zitat antworten Zitat
Chewie

Registriert seit: 10. Jun 2002
Ort: Deidesheim
2.886 Beiträge
 
Turbo Delphi für Win32
 
#6

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 20:37
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.
Martin Leim
Egal wie dumm man selbst ist, es gibt immer andere, die noch dümmer sind
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.106 Beiträge
 
Delphi 11 Alexandria
 
#7

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 21:02
Moin Sebastian,

zum Thema case in einem Record kannst Du mal in der Hilfe unter Varianten-Records nachschauen.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 21:15
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]
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#9

Re: Integer lesen, wie in C

  Alt 29. Mai 2005, 21:23
boah, das ist natürlich nicht schlecht.

Wieder was gelernt, irgendwie wird mir diese Programmiersprache immer sympatischer.
Sebastian
  Mit Zitat antworten Zitat
SebE

Registriert seit: 31. Jul 2004
Ort: Chemnitz
316 Beiträge
 
Delphi 7 Personal
 
#10

Re: Integer lesen, wie in C

  Alt 30. Mai 2005, 19:09
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;
Sebastian
  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 15:21 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