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
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