AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Datentype Array of Byte und Cardinal
Thema durchsuchen
Ansicht
Themen-Optionen

Datentype Array of Byte und Cardinal

Ein Thema von schwa226 · begonnen am 4. Apr 2011 · letzter Beitrag vom 5. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#1

Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:22
Hallo,

ich möchte einRecord machen, damit ich auf eine Zahl als Array of Byte und als Ganzzahl zugreifen kann:

Delphi-Quellcode:
  TCardinalRec = packed record
    case Integer of
      1 : (_Byte : Array[0..3] of Byte);
      2 : (_Cardinal : Cardinal);
  end;
Nun habe ich aber das Problem, das der Cardinal verkehr rum ist.
Also Byte: 00,00,00,05 => 0x05000000

Eigentlich brauche ich es aber so:
0x00000005

Kann man das irgenwie automatisch umdrehen?
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#2

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:37
Ich denke eher, dass Dein Array verkehrt herum ist. Kannst Du es nicht einfach so machen, dass das niederwertigste Byte den Index 0 bekommt?
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 Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#3

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:43
Ich denke eher, dass Dein Array verkehrt herum ist. Kannst Du es nicht einfach so machen, dass das niederwertigste Byte den Index 0 bekommt?
Delphi-Quellcode:
type
  arr = array[3..0] of Byte;
[DCC Fehler] Unit64.pas(28): E2011 Unterer Bereich überschreitet oberen Bereich
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#4

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:44
Leider nein,

ich muss mich an einen C++ Code halten. Und da ist das Array so aufgebaut.
Müsste also irgenwie Little-Endian in Big-Endian wandlen. Also ohne wieder eine extra Funktion dafür zu benötigen.
Delphi 2010, Update 4 & 5
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:46
Das ist bei BigEndian nun mal so.
gib es so aus _Byte[3],Byte[2],_Byte[1],_Byte[0]

Gruß
K-H

Edith: Kein roter Kasten?
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 ( 4. Apr 2011 um 17:49 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#6

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:48
Delphi-Quellcode:
type
  arr = array[3..0] of Byte;
So hatte ich das auch nicht gemeint, sondern bei der Datenübergabe.
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 Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.475 Beiträge
 
Delphi 12 Athens
 
#7

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 17:55
Leider nein,

ich muss mich an einen C++ Code halten. Und da ist das Array so aufgebaut.
Müsste also irgenwie Little-Endian in Big-Endian wandlen. Also ohne wieder eine extra Funktion dafür zu benötigen.
Dann ist Cardinal nicht der richtige Datentyp! Wenn du weißt, daß der Wert als Big-Endian-Cardinal abgespeichert ist, dann kannst du ihn eben nicht als Little-Endian-Cardinal definieren.

Vielleicht hilft dies ja:

Delphi-Quellcode:
type
  TCardinalRec = record
  private
    function GetCardinal: Cardinal;
    procedure SetCardinal(const Value: Cardinal);
  public
    _Byte : packed Array[0..3] of Byte;
    property _Cardinal: Cardinal read GetCardinal write SetCardinal;
  end;
Die beiden Methoden musst du natürlich noch passend implementieren.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
schwa226

Registriert seit: 4. Apr 2008
400 Beiträge
 
#8

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 18:00
Danke, werde ich machen!

Hatte jetzt versucht mit Swap zu arbeiten - dass gefällt mir aber nicht.
Es sollte halt automatisch gehen um Fehler vorzubeugen.

Fertig und geht:
Delphi-Quellcode:
  TCardinalRec = record
    private
      function GetCardinal : Cardinal;
      procedure SetCardinal(const Value : Cardinal);
    public
      _Byte : packed Array[0..3] of Byte;
      Property _Cardinal : Cardinal read GetCardinal write SetCardinal;
  end;

function TCardinalRec.GetCardinal : Cardinal;
begin
  Result :=
    (_Byte[0] Shl 24) or
    (_Byte[1] Shl 16) or
    (_Byte[2] Shl 8) or
    _Byte[3];
end;

procedure TCardinalRec.SetCardinal(const Value : Cardinal);
begin
  _Byte[0] := Value shr 24;
  _Byte[1] := Value shr 16;
  _Byte[2] := Value shr 8;
  _Byte[3] := Value and $FF;
end;
Delphi 2010, Update 4 & 5

Geändert von schwa226 ( 4. Apr 2011 um 18:10 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Datentype Array of Byte und Cardinal

  Alt 4. Apr 2011, 21:40
Wobei man auch die das Byte-Array als Property machen könnte und da einfach den Index umdreht.

PS: Das aus der Signatur könnte man auch ganz gut ins DP-Profil eintragen ... hätte beihnah deine Delphiversion übersehn, als ich wissen wollte, ob Recordmethoden möglich sind.
$2B or not $2B
  Mit Zitat antworten Zitat
gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#10

AW: Datentype Array of Byte und Cardinal

  Alt 5. Apr 2011, 09:26
Fertig und geht:
Delphi-Quellcode:
//...
procedure TCardinalRec.SetCardinal(const Value : Cardinal);
begin
  _Byte[0] := Value shr 24;
  _Byte[1] := Value shr 16;
  _Byte[2] := Value shr 8;
  _Byte[3] := Value and $FF;
end;
Das geht aber nur deshalb, weil Du Rangecheck ausgeschaltet hast oder zu kleine Werte nimmst. Immerhin scheinst Du ja nur zu 75% überzeugt zu sein, sonst hättest Du ja auch konsequenterweise _Byte[3] := Value; gesetzt. Also:
Delphi-Quellcode:
procedure TCardinalRec.SetCardinal(const Value : Cardinal);
begin
  _Byte[0] := Value shr 24 and $FF;
  _Byte[1] := Value shr 16 and $FF;
  _Byte[2] := Value shr 8 and $FF;
  _Byte[3] := Value and $FF;
end;
wobei man sich bei der _Byte[0]-Berechnung theroretisch das and $FF sparen könnte.
  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 23:28 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