Seite 1 von 1

Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 20:26
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

Re: Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 20:53
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

Re: Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 21:06
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

Re: Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 21:20
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

Re: Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 21:46
von funkheld
Au...man, ich danke dir dafür.
Ich muss noch einiges lernen.

Danke.

Gruss

Re: Umrechnen von Single in Bytefolge wieder in Single

Verfasst: 08.02.2012 21:57
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