QByteArray Bereich in float wandeln.

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

QByteArray Bereich in float wandeln.

Beitrag von sandmen »

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
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: QByteArray Bereich in float wandeln.

Beitrag von ScyllaIllciz »

meinst Du das:

Code: Alles auswählen

QByteArray::toFloat(bool * ok = 0) const
???
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

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
Herzogswalder
Beiträge: 79
Registriert: 11. Oktober 2009 00:37
Wohnort: Dresden

Re: QByteArray Bereich in float wandeln.

Beitrag von Herzogswalder »

Dann eben:

Code: Alles auswählen

QByteArray QByteArray::mid( int pos, int len = -1 ) const
Da du ja ein QByteArray zurück bekommst, weiter wie im 2. Post.
Einfach mal Doku zu QByteArray lesen.
Gruß, Herzogswalder
Qt 4.8, OS X Mountain Lion
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

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
franzf
Beiträge: 3114
Registriert: 31. Mai 2006 11:15

Re: QByteArray Bereich in float wandeln.

Beitrag von franzf »

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?
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

Um wieviele Umwandlungen handelt es sich denn, dass du glaubst, deine Performance könnte leiden?
Um ca. max. 3000/sec.
ScyllaIllciz
Beiträge: 200
Registriert: 9. Juli 2010 19:31

Re: QByteArray Bereich in float wandeln.

Beitrag von ScyllaIllciz »

Um ca. max. 3000/sec.
Dann sieht das für mich nach einem Designproblem aus.
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.
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

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
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QByteArray Bereich in float wandeln.

Beitrag von RHBaum »

Könnte ich nicht irgendwie auch memcpy oder so was machen?
Rein von der performance aus, ist der Pferdefuß an der operation, das ZwischenArray was du abziehst ....
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); 
wenn alles ok lief, muss in Dv dein wert stehen, und ptest muss auf das erste zeichen im bytearray zeigen, was nimmer zu deiner Zahl gehoert ....

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 ...
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

3 float werte mit 100Hz, über die Serielle :-)
Ich meinte 1000Hz :-)

Code: Alles auswählen

char mybuffer[5];
memset(mybuffer,0,5);
strncpy(mybuffer,myByteArray[9],4);
float f = atof(mybuffer); 
könnte ich auch so was bauen (nur als Beispiel)

Code: Alles auswählen

float f;
memcpy(f, myByteArray[9],4) ;
?
Was ich mich allerdings frage, wenn das ganze so performance kritisch ist, wieso bekommst deine Daten dann in nem QByteArray ....
Das Einlesen der seriellen, ist bereits fertig, und da kann und will ich nicht mehr ran.
Dieses Interface wird von mehreren Schnittstellen (rs232, ethernet usw. benutzt).
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QByteArray Bereich in float wandeln.

Beitrag von RHBaum »

atof macht ne Textconversion zu float ...

Code: Alles auswählen

memcpy(f, myByteArray[9],4) ;
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 ....
sandmen
Beiträge: 15
Registriert: 23. April 2012 08:27

Re: QByteArray Bereich in float wandeln.

Beitrag von sandmen »

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.
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)
Ups.., daran hab ich noch nicht gedacht. Wie war das? Intel, Motorla Format = Swap. Mal nachlesen :D
Gut darüber gesprochen zu haben.

Ich werde deine Änderung ausprobieren.
Peter
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Re: QByteArray Bereich in float wandeln.

Beitrag von RHBaum »

Intel, Motorla Format = Swap
japp, intel zu motorola musst swappen.
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 ...
Antworten