AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Delphi Float Zahlen in Hex Zahlen umwandeln
Thema durchsuchen
Ansicht
Themen-Optionen

Float Zahlen in Hex Zahlen umwandeln

Offene Frage von "danielA"
Ein Thema von satfer · begonnen am 5. Dez 2013 · letzter Beitrag vom 6. Dez 2013
Antwort Antwort
Seite 1 von 2  1 2      
Darlo

Registriert seit: 28. Jul 2008
Ort: München
1.196 Beiträge
 
Delphi 10.2 Tokyo Enterprise
 
#1

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 11:23
Hi,

kann ja sein, dass ich jetzt komplett daneben liege, aber meines Wissens sind Hex-Zahlen nur Integer.....

Sollte ich hier richtig liegen dann macht es Sinn, dass es
IntToHex() gibt aber kein
FloatToHex()
Philip
  Mit Zitat antworten Zitat
gammatester

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 11:36
Single belegen vier Bytes. Ich nehme an, daß diese 4 Bytes als $xx, $xx, $xx, $xx übertragen werden sollen. Damit bliebe nur die Fragen der Endianness / Endigkeit / Bytereihefolge zu klären. Die Bytes erhält man via variante Records oder per absolute.
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.196 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 11:38
Stimmt, das absolute -Keyword wär auch noch eine Möglichkeit. Hier aber nochmal mit einem Byte-Pointer der über die Single-Variable wandert, ist ja im Endeffekt das gleiche. Und macht mir persönlich weniger Angst.

Und ja, Big- oder Little-Endian müsste auch noch geklärt werden...

Delphi-Quellcode:
procedure TForm5.FormCreate(Sender: TObject);
var
   float: Single;
   byteNo: Integer;

   bytePtr: PByte;

   numHexDigits: Integer;
begin

   float := System.Pi();
   numHexDigits := 16 div (Byte.Size()*8);

   self.Caption := float.ToString()+'=';
   for byteNo := 0 to Pred(float.Size()) do
      self.Caption := self.Caption + float.Bytes[byteNo].ToHexString(numHexDigits);


   memo1.Lines.Append(float.ToString()+' entspricht...');
   bytePtr := Addr(float);
   for byteNo := 0 to Pred(float.Size()) do begin
      memo1.Lines.Append(bytePtr^.ToString() + ' = 0x'+bytePtr^.ToHexString(numHexDigits));
      Inc(bytePtr);
   end;


end;
  Mit Zitat antworten Zitat
gammatester

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 11:50
Mit Delphi 7 wird das so nicht gehen. Sicher und ohne Angst kann man es so machen (mit write als Ersatz für Sende_Hex):
Delphi-Quellcode:
type
  TSingleByteArray = packed array[0..3] of byte; {Single as array of bytes}
var
  s: single;
  i: integer;
begin
  s := 1.12;
  for i:=0 to 3 do write(TSingleByteArray(s)[i]:4);
end;
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#5

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 11:56
Probier mal folgendes:

Code:

...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsSingle);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat  : (FloatValue : Double);
       Conv_AsInteger : (IntValue : Integer);
       Conv_AsByte   : (ByteHH, ByteHL, ByteLH, ByteLL : Byte);
       Conv_AsChar   : (CharHH, CharHL, CharLH, CharLL : Char);
       Conv_AsSingle : (HighSingle, LowSingle : Single);
  end;


  TForm1 = class(TForm)


...


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ConvertVar : TConvertRecord;
    FloatValue : Real;
begin
  FloatValue := 0.0;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));

  FloatValue := 1234.1234;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));
end;

Geändert von danielA ( 5. Dez 2013 um 11:59 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:19
Noch'n Vorschlag:
Delphi-Quellcode:
var
  i : integer;
  a : single;
  b : double;
  pa : pbytearray;
  dummy : string;
begin
  dummy:='';
  a:=1/3+4;
  b:=a;

  memo1.Lines.Add(format('%-3.6g',[a]));
  memo1.Lines.Add(format('%-3.6g',[a]));

  dummy:='';
  pa:=@a;
  for i:=0 to sizeof(a)-1 do
    dummy:=dummy+inttohex(pa^[i],2)+' ';
  memo1.Lines.Add(dummy);

  dummy:='';
  pa:=@b;
  for i:=0 to sizeof(b)-1 do
    dummy:=dummy+inttohex(pa^[i],2)+' ';
  memo1.Lines.Add(dummy);

end;
Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
gammatester

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 12:22
Probier mal folgendes:

Code:

...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsSingle);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat  : (FloatValue : Double);
...
Damit kann man kein Single konvertieren. Es kommt zwar was raus, aber es ist völliger Schrott.
  Mit Zitat antworten Zitat
danielA

Registriert seit: 10. Jun 2002
Ort: Hamburg
72 Beiträge
 
Delphi XE7 Enterprise
 
#8

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 13:04
@Gammatester

Dein Arroganter Kommentar zeigt mir, dass du das Prinzip welches ich hier zeigen wollte definitiv nicht begriffen hast bzw. nicht kennst!
Sonst hättest du mich sicher auf den Fehler hinweisen können!
Im übrigen kosten Typecasts ne Menge Zeit und sind bei so einer einfachen umwandlung schlichtweg überflüssig!

@An den Rest
ich habe mich leider beim Byteszählen vertan. Hier nun noch einmal die berichtigte Variante

Code:


...

type
  TConvert32Bit = (Conv_AsFloat, Conv_AsInteger, Conv_AsByte, Conv_AsChar, Conv_AsCardinal);

  TConvertRecord = record
  case TConvert32Bit of
       Conv_AsFloat : (FloatValue : Single);
       Conv_AsInteger : (IntValue : Integer);
       Conv_AsByte  : (ByteHH, ByteHL, ByteLH, ByteLL : Byte);
       Conv_AsChar  : (CharHH, CharHL, CharLH, CharLL : Char);
       Conv_AsCardinal : (CardinalValue : Cardinal);
  end;


  TForm1 = class(TForm)


...


implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var ConvertVar : TConvertRecord;
    FloatValue : Single;
begin
  FloatValue := 0.0;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));

  FloatValue := 1234.1234;
  ConvertVar.FloatValue := FloatValue;
  ShowMessage(IntToHex(ConvertVar.IntValue, 8));
end;
PS.: der Ton spielt die Musik. Ich habe kein Problem damit, wenn man mich auf Fehler hinweist. Die Frage ist nur Wie!
  Mit Zitat antworten Zitat
gammatester

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 13:52
@Gammatester
Dein Arroganter Kommentar zeigt mir, dass du das Prinzip welches ich hier zeigen wollte definitiv nicht begriffen hast bzw. nicht kennst!
Sonst hättest du mich sicher auf den Fehler hinweisen können!
Im übrigen kosten Typecasts ne Menge Zeit und sind bei so einer einfachen umwandlung schlichtweg überflüssig!
Der Ausdruck 'Schrott' bezog sich auf das Ergebnis nicht auf Deinen Code (das der fehlerhaft war, ist ja unzweifelhaft). Im Übrigen brauchen Typecasts nicht nur nicht 'ne Menge Zeit' sondern sondern gar keine, weil die Variable vom Compiler re-interpretiert wird, und mM ist das auch einfacher und durchsichtiger als Deine Konstruktion, die einen impliziten verdeckten Typecast gleichkommt.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Float Zahlen in Hex Zahlen umwandeln

  Alt 5. Dez 2013, 14:03
Hi,

kann ja sein, dass ich jetzt komplett daneben liege, aber meines Wissens sind Hex-Zahlen nur Integer.....

Sollte ich hier richtig liegen dann macht es Sinn, dass es
IntToHex() gibt aber kein
FloatToHex()
HEX ist kein Integer.

Eine Hexadezimalzahl ist eine "Zahl" in Hexadezimaler Darstellung. (0-15 pro Ziffer)

Einen Integer kann mal man auch in vielen Zahlensystemen darstellen (meisten kennen wir aber das Dezimalsystem mit 0-9 pro Ziffer)
oder Binär mit 0-1 pro Ziffer.

Als ganze Zahl läßt sich aber das Zahlensystem leicht umrechnen, weswegen es auch eine passende Funktion gibt.

Wenn man aber den "binären" Speicherhinhalt des "Float" betrachtet, dann ist der auch Hexadezimal darstellbar, aber der enthaltene Fießkommawert ist es nicht, weswegen es auch keine funktion dafür gibt.
Für den binären Inhalt des speichers gibt es z.B. Delphi-Referenz durchsuchenBinToHex.

Aber wie schon erwähnt wurde, muß man da wissen in welcher Reihenfolge die Bytes übertragen werden müssen.

IntToHex stellt die Bytes z.B. in einer anderen Reihenfolge dar, wie das BinToHex.
BinToHex: kleines Byte im speicher = links und kleines Byte im Hex-String ist auch links
IntToHex: großes Byte im Hex ist links (also kleines Byte ist rechts)
Ein Therapeut entspricht 1024 Gigapeut.
  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 04:34 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