Umrechnen von Single in Bytefolge wieder in Single

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Umrechnen von Single in Bytefolge wieder in Single

Beitrag von funkheld »

Hallo, guten Tag.
Ich möchte Single-Zahlen in Bytefolge umrechnen in Single.

Wie wird aus dieser Single in Bytefolge wieder eine Single?
Es sind 4 HexByte : C0 39 24 41

Ich habe dieses beim Zusi-TCP gefunden :
Dieses Delphi-Beispiel zeigt die Konvertierung von Datentyp Single in den Speicherbereich von 4 Bytes (im Beispiel ein Array) sowie die Rückkonvertierung in den Datentyp Single.

procedure ConvertSingle;
var
FOriginalSingle: Single;
FTransportArray: Array[0..3] of Byte;
FKopieSingle: Single;

begin
// Initialisieren
FOriginalSingle := 1234.9876;
FKopieSingle := 0.0;

// In Byte-Array abspeichern
PSingle(@FTransportArray)^ := FOriginalSingle;

// Das Byte-Array kann nun über TCP übertragen werden
// Danach muß es wieder dekodiert werden:
FKopieSingle := PSingle(@FTransportArray)^;
end;
Wer kann hier mal weiterhelfen ?

Danke.

Gruss
Benutzeravatar
Danilo
-= Anfänger =-
Beiträge: 2284
Registriert: 29.08.2004 03:07

Re: Umrechnen von Single in Bytefolge wieder in Single

Beitrag von Danilo »

funkheld hat geschrieben:Wie wird aus dieser Single in Bytefolge wieder eine Single?
Es sind 4 HexByte : C0 39 24 41

Ich habe dieses beim Zusi-TCP gefunden :
Sollen diese 4 Hex-Zahlen das 1234.9876 aus dem Beispiel ergeben, oder
sind diese Zahlen von woanders?

Probiere mal ob das bei Dir die richtigen Werte ergibt:

Code: Alles auswählen

Structure ConvertSingle
    StructureUnion
        single.f
        TransportArray.a[4]
    EndStructureUnion
EndStructure

var.ConvertSingle\single = 1234.9876

Debug Hex( var\TransportArray[0] )
Debug Hex( var\TransportArray[1] )
Debug Hex( var\TransportArray[2] )
Debug Hex( var\TransportArray[3] )


var\TransportArray[0] = $C0
var\TransportArray[1] = $39
var\TransportArray[2] = $24
var\TransportArray[3] = $41

Debug var\single
cya,
...Danilo
"Ein Genie besteht zu 10% aus Inspiration und zu 90% aus Transpiration" - Max Planck
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Umrechnen von Single in Bytefolge wieder in Single

Beitrag von funkheld »

Hallo hier habe ich ein Muster von Zusi:

Bytefolge:
E7:75:03:40 Geschwindigkeit
00:40:93:44 Motordrehzahl
00:00:A0:40 Fahrstufe

Single:
Geschwindigkeit = 2,05407118797
Motordrehzahl = 1178,0
Fahrstufe = 5,0

Danke.

Gruss
- chris -
Beiträge: 195
Registriert: 24.08.2005 19:52
Wohnort: Stadtallendorf

Re: Umrechnen von Single in Bytefolge wieder in Single

Beitrag von - chris - »

Hallo

Diese Bytefolge E7:75:03:40 ergibt den Wert 2.05407118797302.

Code: Alles auswählen


*buffer = AllocateMemory(1024)
If *buffer = 0
  End
EndIf  

;E7:75:03:40

PokeA(*buffer + 0, $E7)
PokeA(*buffer + 1, $75)
PokeA(*buffer + 2, $03)
PokeA(*buffer + 3, $40)

a.f = PeekF(*buffer)

Debug a

Ergebnis: 2.05407118797302

Code: Alles auswählen


*buffer = AllocateMemory(1024)
If *buffer = 0
  End
EndIf

b.f = 2.05407118797302

PokeF(*buffer, b)

zeile$ = ""
For n = 0 To 3
  zeile$ = zeile$ + RSet(Hex(PeekA(*buffer + n)), 2, "0")
  If n < 3
    zeile$ = zeile$ + ":"
  EndIf  
Next n 
Debug zeile$

Ergebnis: E7:75:03:40
PB v5.72 x86/x64
Windows 10 Pro 64bit
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Re: Umrechnen von Single in Bytefolge wieder in Single

Beitrag von funkheld »

Au...man, ich danke dir dafür.
Ich muss noch einiges lernen.

Danke.

Gruss
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Umrechnen von Single in Bytefolge wieder in Single

Beitrag von ts-soft »

Die von Danilo gezeigte Strukture macht dasselbe, aber etwas eleganter :mrgreen:
Damit Du das siehst:

Code: Alles auswählen

Structure ConvertSingle
    StructureUnion
        single.f
        TransportArray.a[4]
    EndStructureUnion
EndStructure

;E7:75:03:40
Define var.ConvertSingle
var\TransportArray[0] = $E7
;PokeA(*buffer + 0, $E7)
var\TransportArray[1] = $75
;PokeA(*buffer + 1, $75)
var\TransportArray[2] = $03
;PokeA(*buffer + 2, $03)
var\TransportArray[3] = $40
;PokeA(*buffer + 3, $40)

;a.f = PeekF(*buffer)
;Debug a

Debug var\single
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Antworten