Utf-8 - Array in Gleitkommazahl (signed)

sadik

Level-1
Beiträge
30
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo

Ich habe ein Array von Bytes. Ich empfange über TCP UTF-8 Strings
z.B die Zahl 0,4289 wird in dem Array wie folgt abgespeichert immer
utf-8 encoded: 48, 44 (,), 52, 50, 56, 57.
Gibt es bereits Funktionen die das abnehmen d.h in Unsigned Real direkt umwandeln.
 
Gibt es vielleicht für Deine SPS die Funktion STRING_TO_REAL()?
Ansonsten vielleicht 1x oder 2x STRING_TO_WORD() oder ähnliches nehmen und entsprechend Position des Dezimalkommas dividieren.
Ansonsten Zeichen für Zeichen zu DINT und danach zu REAL wandeln ist auch nicht schwer.

Harald
 
Zuviel Werbung?
-> Hier kostenlos registrieren
Gibt es vielleicht für Deine SPS die Funktion STRING_TO_REAL()?
Ansonsten vielleicht 1x oder 2x STRING_TO_WORD() oder ähnliches nehmen und entsprechend Position des Dezimalkommas dividieren.
Ansonsten Zeichen für Zeichen zu DINT und danach zu REAL wandeln ist auch nicht schwer.

Harald

Ok das Problem ist ich habe Zahlenwerte als UTF-8 kodiert z.B die Zahl 0 ist in meinem Array als Hex in UTF-8 16#30 usw.
Macht hier STRING_TO_REAL kein Sinn eigentlich und STRING_TO_WORD und die weiteren weil sie UTF-8 und die entsprechende Repräsentation nicht kennen.

z.B STRING_TO_REAL('48') (*48 === 0 in UTF-8*) leifert als Ergebbis 48.
 
48 ist doch der UTF8 codierte ASCII Wert im Array, oder? Dann verstehe ich das STRING_TO_REAL('48') aus dem letzten Post nicht.

Code:
VAR 
    arTestArray: ARRAY[0..6] OF BYTE:= [48, 46, 52, 50, 56, 57, 0];
    pTestString: POINTER TO STRING;
    rRealValue: REAL;
END_VAR
pTestString:= ADR(arTestArray);
rRealValue:= STRING_TO_REAL(pTestString^);

Es könnte mit STRING_TO_REAL direkt gehen, wenn das Byte-Array über Pointer als STRING interpretiert wird.
Allerdings muss ',' durch '.' ersetzt werden, bzw. 44 durch 46. Und der letzte Wert muss 0 sein, damit sich aus den ARRAY-Werten ein nullterminierter STRING ergibt.

witkatz
 
Zuletzt bearbeitet:
Danke es funktioniert.
48 ist doch der UTF8 codierte ASCII Wert im Array, oder? Dann verstehe ich das STRING_TO_REAL('48') aus dem letzten Post nicht.

Code:
VAR 
    arTestArray: ARRAY[0..6] OF BYTE:= [48, 46, 52, 50, 56, 57, 0];
    pTestString: POINTER TO STRING;
    rRealValue: REAL;
END_VAR
pTestString:= ADR(arTestArray);
rRealValue:= STRING_TO_REAL(pTestString^);

Es könnte mit STRING_TO_REAL direkt gehen, wenn das Byte-Array über Pointer als STRING interpretiert wird.
Allerdings muss ',' durch '.' ersetzt werden, bzw. 44 durch 46. Und der letzte Wert muss 0 sein, damit sich aus den ARRAY-Werten ein nullterminierter STRING ergibt.

witkatz
 
Zurück
Oben