Seite 2 von 3

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 09:31
von DarkDragon
AND51 hat geschrieben:
Und am besten gleich einen Binärstring einer Floatzahl hinzufügen, mit Formeln zum zurückwandeln
Natürlich kann man Floatzahlen aus unserem Dezimalsystem in das Binärsystem und damit auch in jedes andere System umwandeln.
Das geht mit dem Horner-Schema.
Mit dem Horner Schema hab ich bisher nur die Polynomdivision umgehen können (Wir haben in der Schule explizit nur Horner Schema durchgenommen weil der Lehrer meinte Polynomdivision braucht niemand wenn er das Horner Schema kann), aber wie man da in andere Zahlensysteme umwandelt weiß ich noch nicht.

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 09:35
von ts-soft
@Thorium

Mag ja sein das man den Wert berechnen kann, aber ein Hexstring ist es nicht.
Woran soll man erkennen, das es 32-Bit und Floatingpoint ist?

Netter Rechner :allright:
korrekte Schreibweise eines 32-Bit Floatingpoint Hexstrings suche ich immer
noch :mrgreen:

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 09:49
von Thorium
ts-soft hat geschrieben:@Thorium

Mag ja sein das man den Wert berechnen kann, aber ein Hexstring ist es nicht.
Woran soll man erkennen, das es 32-Bit und Floatingpoint ist?

Netter Rechner :allright:
korrekte Schreibweise eines 32-Bit Floatingpoint Hexstrings suche ich immer
noch :mrgreen:
Klar ist es ein Hexstring, kodiert nach IEEE-754.
Erkennen tut man nicht, man weis. Es ist immer eine Interpretationsfrage.

Du würdest ja auch nicht anzweifeln das 1056 ein hexadezimaler String ist, wenn ich das sagen würden. Erkennen kann man es nicht, man muss es einfach wissen. Man kann Daten halt unterschiedlich interpretieren. Die Zahl könnte hexadezimal sein, oder dezimal, oder sogar octal. Reine Interpretationssache.

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 10:04
von ts-soft
> Erkennen tut man nicht, man weis. Es ist immer eine Interpretationsfrage.
Es gibt keine allgemeingültige Regel für die Darstellung von
Fließkommazahlen mit Hexadezimalzahlen, d.h. es gibt, anders als bei der
Fließkommadarstellung von Dezimalzahlen, keine Regel für die Darstellung
der Trennung von 'Vorkomma-' und 'Nachkomma'-Stellen. Das Komma dürfte hier
nicht verwendet werden, da sonst z.B. dezimales '1.1' und hexadezimales '1.1'
nicht zu unterscheiden sind - es sei denn, es wird ein Präfix oder Suffix verwendet,
das den hexadezimalen Wert als solchen kennzeichnet. Aber auch dafür gibt es keine
allgemeingültige Regel, es gibt nur in bestimmten, relativ beschränkten
Bereichen (Computer) gewisse Konventionen ('$...', '...$', 'x...', '0x...',
'...h', '&H...').
Also ist die Umwandlung in Hexstrings nicht möglich, lediglich in Hexwerte :mrgreen:

Warum glaubt mir keiner :lol:

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 10:25
von Little John
Langstein hat geschrieben:ich möchte eine Floatzahl (z.B. 72.0) in einen Hexstring z.B. X'42900000' umwandeln.
Thorium hat geschrieben:Er hat sich nur etwas unglücklich ausgedrückt. Natürlich ist das keine Kommazahl, es ist ein Hexstring der Binärdaten des Floats. So wie wenn du den Float in eine Datei speicherst und dir die Datei dann mit nem Hexeditor anschaust.
Ich glaube auch, dass der OP das so gemeint hat. Er hätte besser geschrieben: "Ich möchte den Hexdump des Speicherbereiches, in dem sich eine bestimmte Fließkommazahl befindet." o.Ä. Dann wäre die Verwirrung geringer gewesen. :-)

Gruß, Little John

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 11:00
von Little John
Thomas, woher stammt denn dieses Zitat?
Das Komma dürfte hier nicht verwendet werden, da sonst z.B. dezimales '1.1' und hexadezimales '1.1' nicht zu unterscheiden sind - es sei denn, es wird ein Präfix oder Suffix verwendet, das den hexadezimalen Wert als solchen kennzeichnet.
Jo hauaha! Das ist das schönste Nonsense-Argument, das ich seit langem gelesen habe. :-)
Tatsächlich ist auch z.B. das dezimale '21' ohne Präfix oder Suffix nicht vom hexadezimalen '21' zu unterscheiden. Das wird wohl der Grund sein, weshalb man sowas eben mit Prä- oder Suffix schreibt ... Aus ganz ähnlichen Gründen schreibt man übrigens manchmal auch nicht einfach nur '7', sondern '7 kg', '7 m', '7 EUR' oder sonstwas, je nachdem was man meint. :D

Gruß, Little John

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 11:34
von Froggerprogger
...was für eine Diskussion ;)

@Langstein:
Dein geposteter Code ist

Code: Alles auswählen

Structure my_data
StructureUnion
  byte.c[3];0...3
  real_value.f
EndStructureUnion
EndStructure

Dim m.my_data(0)

m(0)\real_value = 72.0
Debug m(0)
Das Debug m(0) gibt nur den Pointer auf den Datensatz m(0) aus, nicht aber die entsprechenden Bytes, wie anscheinend von Dir gewünscht. Dazu nimm Debug m(0)\byte[0]...Debug m(0)\byte[3], oder die von Thorium gepostete Antwort mittels Hex(PeekL(...)), oder den (mit deinem fast identischen) Ansatz von Kaeru mittels StructureUnion, aber diesmal nicht einzlne Bytes, sondern ein Long.

All die Lösungen geben (wie hier wild diskutiert) die Bits des Floats in seiner Standard-Fließkommadarstellung wieder. Dabei ist das erste Bit das Vorzeichen, dann folgen binäre Codierungen des Exponenten und der Mantisse. Diese lassen sich natürlich auch als Hexwerte darstellen. Dies ist allerdings (offensichtlich) was anderes, als die Zahl im Hexadezimalsystem darzustellen. Also je nachdem, was Du erreichen möchtest, kennst Du nun bereits 3 Lösungen, oder noch keine :)

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 13:16
von Fluid Byte
:lurk:

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 13:52
von DarkDragon
Froggerprogger hat geschrieben:...was für eine Diskussion ;)

@Langstein:
Dein geposteter Code ist

Code: Alles auswählen

Structure my_data
StructureUnion
  byte.c[3];0...3
  real_value.f
EndStructureUnion
EndStructure

Dim m.my_data(0)

m(0)\real_value = 72.0
Debug m(0)
Das Debug m(0) gibt nur den Pointer auf den Datensatz m(0) aus, nicht aber die entsprechenden Bytes, wie anscheinend von Dir gewünscht. Dazu nimm Debug m(0)\byte[0]...Debug m(0)\byte[3], oder die von Thorium gepostete Antwort mittels Hex(PeekL(...)), oder den (mit deinem fast identischen) Ansatz von Kaeru mittels StructureUnion, aber diesmal nicht einzlne Bytes, sondern ein Long.

All die Lösungen geben (wie hier wild diskutiert) die Bits des Floats in seiner Standard-Fließkommadarstellung wieder. Dabei ist das erste Bit das Vorzeichen, dann folgen binäre Codierungen des Exponenten und der Mantisse. Diese lassen sich natürlich auch als Hexwerte darstellen. Dies ist allerdings (offensichtlich) was anderes, als die Zahl im Hexadezimalsystem darzustellen. Also je nachdem, was Du erreichen möchtest, kennst Du nun bereits 3 Lösungen, oder noch keine :)
Soweit ich mich erinnern kann hieß es in PureBasic immer:
PureBasic Hilfe hat geschrieben:Bitte beachten Sie, dass sich in Strukturen ein statisches Array[] nicht so verhält wie das normale BASIC Array (definiert mittels Dim), um konform zum C/C++ Strukturen Format zu bleiben (was direkte API Strukturen Portierung ermöglicht). Dies bedeutet, dass a[2] ein Array von 0 bis 1 definiert, wogegen Dim a(2) ein Array von 0 bis 2 anlegt.
Also

Code: Alles auswählen

; ...
  byte.c[4] ;0...3
; ...
:bounce:
Danke dass ich auch mal die Möglichkeit bekomm dir was zu berichtigen.

Achja, der Typ .c gefällt mir nicht (Kompillier das nur mal im Unicode Modus, dann ist der Datenblock ja doppelt oder vierfach so groß und es sind nichtmehr einzelne Bytes). Neuerdings gibts doch .a.

[EDIT]
Ups das war ja garnicht Froggerproggers Code. :allright: Hätte ich früher wissen sollen :lol: . Aber Froggerprogger hat das mit der Arraygröße auch nicht gemerkt.

Re: Umwandlung float in einen Hexstring

Verfasst: 04.10.2009 15:14
von AND51
ts-soft hat geschrieben:Es geht darum, eine Floatzahl als Hex oder Binärstring zurückzuwandeln.
Es gibt weder hexadezimale Floatzahlenstring, noch binäre Floatzahlenstrings, somit
sind sie auch nicht zurückwandelbar, auch nicht mit einem Hörnchen-Schema :lol:
Achso. Ich dachte, er wolle eine Zahl in eine Binärkommazahl (oder Hex-Kommazahl) umwandeln und das Ergebnis, beispielsweise "BAD,F00D" nur als String speichern, weil es keinen nativen Datentyp dafür gibt.
Dann habe ich das Problem wohl falsch verstanden.