QByteArray Bereich in float wandeln.
QByteArray Bereich in float wandeln.
Hallo,
ich möchte einen Bereich z.B. einen float aus einem QByteArray in eine float Variable kopieren.
Ich steh gerade etwas auf dem Schlauch.
Wäre schön wenn mir jemand helfen könnte.
Danke
Peter
ich möchte einen Bereich z.B. einen float aus einem QByteArray in eine float Variable kopieren.
Ich steh gerade etwas auf dem Schlauch.
Wäre schön wenn mir jemand helfen könnte.
Danke
Peter
-
- Beiträge: 200
- Registriert: 9. Juli 2010 19:31
Re: QByteArray Bereich in float wandeln.
meinst Du das:
???
Code: Alles auswählen
QByteArray::toFloat(bool * ok = 0) const
Re: QByteArray Bereich in float wandeln.
Nee, Ich meine
QBytearray von einer bestimmten Position aus .
Der float fängt im 10.Byte an, und hört 4 Byte weiter auf.
Und jetzt würde ich das in eine variable kopieren wollen.
Danke
Peter
QBytearray von einer bestimmten Position aus .
Der float fängt im 10.Byte an, und hört 4 Byte weiter auf.
Und jetzt würde ich das in eine variable kopieren wollen.
Danke
Peter
-
- Beiträge: 79
- Registriert: 11. Oktober 2009 00:37
- Wohnort: Dresden
Re: QByteArray Bereich in float wandeln.
Dann eben:
Da du ja ein QByteArray zurück bekommst, weiter wie im 2. Post.
Einfach mal Doku zu QByteArray lesen.
Code: Alles auswählen
QByteArray QByteArray::mid( int pos, int len = -1 ) const
Einfach mal Doku zu QByteArray lesen.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
Qt 4.8, OS X Mountain Lion
Re: QByteArray Bereich in float wandeln.
Hallo,
dein Vorschlag ist gut, und funktioniert auch.
Leider muss ich diese Operationen öfters, machen, sehr oft.
Könnte ich nicht irgendwie auch memcpy oder so was machen?
Nochmals danke
Peter
dein Vorschlag ist gut, und funktioniert auch.
Leider muss ich diese Operationen öfters, machen, sehr oft.
Könnte ich nicht irgendwie auch memcpy oder so was machen?
Nochmals danke
Peter
Re: QByteArray Bereich in float wandeln.
Wieso memcpy? Im ByteArray steht dein float als Folge von chars, und nicht als Folge von Bits, die von der Hardware direkt als float erkannt werden könnte. Folglich ist eine Umwandlung von char-Folge nach float nötig, was dir dankenswerterweise QByteArray::toFloat() abnimmt.
Um wieviele Umwandlungen handelt es sich denn, dass du glaubst, deine Performance könnte leiden?
Um wieviele Umwandlungen handelt es sich denn, dass du glaubst, deine Performance könnte leiden?
Re: QByteArray Bereich in float wandeln.
Um ca. max. 3000/sec.Um wieviele Umwandlungen handelt es sich denn, dass du glaubst, deine Performance könnte leiden?
-
- Beiträge: 200
- Registriert: 9. Juli 2010 19:31
Re: QByteArray Bereich in float wandeln.
Dann sieht das für mich nach einem Designproblem aus.Um ca. max. 3000/sec.
Wo kommen die Daten her? Es klingt so als kommen von einem Echtzeitbus zyklisch Daten. Dann sollte es doch andere Möglichkeiten geben, die Daten aufzubereiten!? A
lso ein paar mehr Infos wären hilfreich.
Re: QByteArray Bereich in float wandeln.
Die Daten kommen von einer seriellen Schnittstelle.
Die Daten werden binär empfangen.
Das Telegramm hat eine Anfangskennung in char, dann kommen zwei byte Länge der Daten,
dann kommen die Daten (nur float) und dann noch zwei byte crc. Alle daten ab der Anfangskennung sind im crc.
Leider benötige ich die Daten so schnell.
3 float werte mit 100Hz, über die Serielle
Danke
Peter
Die Daten werden binär empfangen.
Das Telegramm hat eine Anfangskennung in char, dann kommen zwei byte Länge der Daten,
dann kommen die Daten (nur float) und dann noch zwei byte crc. Alle daten ab der Anfangskennung sind im crc.
Leider benötige ich die Daten so schnell.
3 float werte mit 100Hz, über die Serielle
Danke
Peter
Re: QByteArray Bereich in float wandeln.
Rein von der performance aus, ist der Pferdefuß an der operation, das ZwischenArray was du abziehst ....Könnte ich nicht irgendwie auch memcpy oder so was machen?
QByteArray QByteArray::mid( int pos, int len = -1 ) const
wird dir ein neues arry erzeugen, dabei dynamischen spreicher brauchen, also quasi in irgend einer form alloc aufrufen -> undefinierte Laufzeit.
den new aufruf vermeidest, in dem den Buffer aufn stack anlegst ....
also sowas z.b.
Code: Alles auswählen
char mybuffer[5];
memset(mybuffer,0,5);
strncpy(mybuffer,myByteArray[9],4);
float f = atof(mybuffer);
wenn hinter der float zahl keine interpretierbaren ziffern stehen, welche das ergebniss verfaelschen, kannst auch ohne kopie arbeiten .... allerdings dann mit doubles (sind auf modernen systemen nicht so viel langsamer wie floats !!!)
die methode der wahl ist dann strtod !
Code: Alles auswählen
char * ptest = nullptr;
double dV = strtod(myByteArray[9],&ptest);
Was ich mich allerdings frage, wenn das ganze so performance kritisch ist, wieso bekommst deine Daten dann in nem QByteArray ....
eigentlich solltest mit deiner funktion dann direkt auf die Puffer schiessen, die von deiner "eingabe" (was auch immer das ist) direkt befuellt werden ....
Oder schiesst die Eingabe auf ein Praeperiertes QByteArray ???
Ciao ...
Re: QByteArray Bereich in float wandeln.
Ich meinte 1000Hz3 float werte mit 100Hz, über die Serielle
Code: Alles auswählen
char mybuffer[5];
memset(mybuffer,0,5);
strncpy(mybuffer,myByteArray[9],4);
float f = atof(mybuffer);
Code: Alles auswählen
float f;
memcpy(f, myByteArray[9],4) ;
Das Einlesen der seriellen, ist bereits fertig, und da kann und will ich nicht mehr ran.Was ich mich allerdings frage, wenn das ganze so performance kritisch ist, wieso bekommst deine Daten dann in nem QByteArray ....
Dieses Interface wird von mehreren Schnittstellen (rs232, ethernet usw. benutzt).
Re: QByteArray Bereich in float wandeln.
atof macht ne Textconversion zu float ...
das kopiert nur die 4 byte runter und reinterpretiert die dann als float.
Das was ganz anderes !
Das kann natuerlich richtig sein, wenn:
- Der sender es genau so macht, also die floats einfach binaer auf den Datenstrom raufkopiert
- Sender und empfaenger gleiche Umgebung haben (gleiche byte Ausrichtung LSB/MSB, beide die selbe definition von 4 Byte FLoats haben, gleichegrossen bereich fuer Mantisse und exponent)
Normal geht man bei serieller Kommunikation nicht davon aus, sondern die iss meist Textbasierend (bessere debugbarkeit, logging, und es ist Systemunabhaengiger).
Wenn du natuerlich binaer kommunizierst, iss deine version richtig ...
Fuer Ethernet gilt das gleiche um so mehr
Also, wer schreibt die daten ??? iss das nen PC, nen embedded Controller ?
Ciao ....
Code: Alles auswählen
memcpy(f, myByteArray[9],4) ;
Das was ganz anderes !
Das kann natuerlich richtig sein, wenn:
- Der sender es genau so macht, also die floats einfach binaer auf den Datenstrom raufkopiert
- Sender und empfaenger gleiche Umgebung haben (gleiche byte Ausrichtung LSB/MSB, beide die selbe definition von 4 Byte FLoats haben, gleichegrossen bereich fuer Mantisse und exponent)
Normal geht man bei serieller Kommunikation nicht davon aus, sondern die iss meist Textbasierend (bessere debugbarkeit, logging, und es ist Systemunabhaengiger).
Wenn du natuerlich binaer kommunizierst, iss deine version richtig ...
Fuer Ethernet gilt das gleiche um so mehr
Also, wer schreibt die daten ??? iss das nen PC, nen embedded Controller ?
Ciao ....
Re: QByteArray Bereich in float wandeln.
Hi,
etwas späte aber dennoch.
Ja, ein micro-controller.
Das ganze dient zur Kalibrierung von Brushless controller zu Motor.
Ich muss halt die Daten relativ schnell, bei mir auf der Maschine haben.
Gut darüber gesprochen zu haben.
Ich werde deine Änderung ausprobieren.
Peter
etwas späte aber dennoch.
Ja, ein micro-controller.
Das ganze dient zur Kalibrierung von Brushless controller zu Motor.
Ich muss halt die Daten relativ schnell, bei mir auf der Maschine haben.
Ups.., daran hab ich noch nicht gedacht. Wie war das? Intel, Motorla Format = Swap. Mal nachlesenSender und empfaenger gleiche Umgebung haben (gleiche byte Ausrichtung LSB/MSB, beide die selbe definition von 4 Byte FLoats haben, gleichegrossen bereich fuer Mantisse und exponent)
Gut darüber gesprochen zu haben.
Ich werde deine Änderung ausprobieren.
Peter
Re: QByteArray Bereich in float wandeln.
japp, intel zu motorola musst swappen.Intel, Motorla Format = Swap
Da du keine einzelnen bits extrahierst, intressiert dich nur die Byte-Reihenfolge.
Die frage ist, was du als Standard nimmst ...
Intel ist LSB, Motorola MSB, die "Standardisierte" network byte order ist MSB
hasst du auf deinem embedded system network libs zur verfuegung ... htons htonl und co ? Damit sollte das schnell und portabel gehen.
Bleibt noch die frage ob der aufbau der floats auf deinen beiden Systemen gleich ist ...
Aber das solltest ueber tests recht fix rausbekommen.
Ciao ...