[gelöst]QByteArray nach Integer konvertieren....

Alles rund um die Programmierung mit Qt
Antworten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

[gelöst]QByteArray nach Integer konvertieren....

Beitrag von AuE »

Hi @ll,

sehe grade den Wald vor lauter Bäumen nicht.

Ich lese 4 Byte ein und möchte diese nun in einen Integer haben:

Code: Alles auswählen

	const QByteArray ba = m_logFile->read(4);

		int size =		(static_cast<int>(ba[0]) & 0xFF) << 8
				+	(static_cast<int>(ba[1]) & 0xFF) << 8
				+	(static_cast< int>(ba[2]) & 0xFF) << 8
				+	(static_cast<int>(ba[3]) & 0xFF) << 8;

Byte Array enthält: c5 3a 01 00 was eigentlich 80581dez sein sollte. allerdings schlagen sowohl der obige code wie auch das casten etc fehl. Hat jmd. von euch eine Idee?
Zuletzt geändert von AuE am 23. November 2009 14:25, insgesamt 1-mal geändert.
pfid
Beiträge: 535
Registriert: 22. Februar 2008 16:59

Beitrag von pfid »

Was stimmt nicht mit http://qt.nokia.com/doc/4.5/qbytearray.html#toInt ? Oder steh ich auch im Wald?
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Re: QByteArray nach Integer konvertieren....

Beitrag von RavenIV »

AuE hat geschrieben: sehe grade den Wald vor lauter Bäumen nicht.
Dein shiften passt nicht.
ba[0] musst Du nicht shiften (<< 0)
ba[1] musst Du 8 l-shiften (<< 8)
ba[2] musst du 16 l-shiften (<< 16)
ba[3] musst du 32 l-shiften (<< 32)

Dann alles addieren und fertig.
Linux, das längste Text-Adventure aller Zeiten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

sch**ße ja ;-)
thx!
RavenIV
Beiträge: 267
Registriert: 21. Januar 2009 14:24
Wohnort: Waldshut

Beitrag von RavenIV »

AuE hat geschrieben:sch**ße ja ;-)
thx!
Warum eigentlich nicht QByteArray.toInt()?
Dann sparst Du Dir das ganze shifting.
Linux, das längste Text-Adventure aller Zeiten
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Weil das nicht funktioniert ;-)

Liefert den falschen Wert!


Liegt daran das in dem Byte keine ascii zeichen(druckbaren) stehen(wenn ich das in anderen foren richtig gelesen hab)


Code: Alles auswählen

const QByteArray ba = m_logFile->read(4);

		int size =		((static_cast<int>(ba[3]) & 0xFF)<<32)
				+	((static_cast<int>(ba[2]) & 0xFF) << 16)
				+	((static_cast< int>(ba[1]) & 0xFF) << 8)
				+	((static_cast<int>(ba[0]) & 0xFF) );

		bool bOk = false;

		

		qDebug()  <<"toInt8"<< ba.toInt(&bOk, 8);
		qDebug()  <<"toInt16"<< ba.toInt(&bOk, 16);
		qDebug()  <<"toInt32"<< ba.toInt(&bOk, 32);
		qDebug()  <<"toInt0"<< ba.toInt(&bOk, 0);
		qDebug() <<  "Shifted size is"<< size;

liefert
const QByteArray ba = m_logFile->read(4);

int size = ((static_cast<int>(ba[3]) & 0xFF)<<32)
+ ((static_cast<int>(ba[2]) & 0xFF) << 16)
+ ((static_cast< int>(ba[1]) & 0xFF) << 8)
+ ((static_cast<int>(ba[0]) & 0xFF) );

bool bOk = false;



qDebug() <<"toInt8"<< ba.toInt(&bOk, 8);
qDebug() <<"toInt16"<< ba.toInt(&bOk, 16);
qDebug() <<"toInt32"<< ba.toInt(&bOk, 32);
qDebug() <<"toInt0"<< ba.toInt(&bOk, 0);
qDebug() << "Shifted size is"<< size;
Zitat von qtforum.org
QByteArray also has toInt() method... but if I do array.toInt(&ok, 16) it will return 0 becuase, for example, 0x2A will be intepreted at some ascii value that's not between 1-9 or A-F... so it could not do the convertion. Note that I'm dealing will raw hex data here and not ascii. Am I missing something here?
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Nur einen Satz aus der RFC 1952 (GZIP Format) verstehe ich nich
ISIZE (Input SIZE)
This contains the size of the original (uncompressed) input
data modulo 2^32.
==> Das ist das was ich bestimmt hab. Das ganze scheint aber nicht immer zu stimmen (wegen2^32 = 4294967296 geht das ganze nur bis 4GB) .
Wenn ich zB ein File mit 5GB verpackt habe stimmen die Werte nicht mehr überein.


Dateien bis 4GB sind kein Prob....


DAMN!
Mani99
Beiträge: 244
Registriert: 15. April 2009 10:46
Wohnort: München

Beitrag von Mani99 »

Kannst du das näher erläutern warum das nicht stimmt? Event. code ausschnitt oder so, dann findet sicher jemand die/eine lösung!
AuE
Beiträge: 918
Registriert: 5. August 2008 10:58

Beitrag von AuE »

Habdie Lösung:

Also gzip speichert die Größe indem es die letzten 4 Bytes die Größe anhängt. Demnach können max 2^32 dargestellt werden.

Sprich bei ner 5GB Datei bekomme ich nur das was fehlt zurück. Also quasi 7xxMB.

Scheinbar haben die damals nicht daran gedacht das es mal größere files geben wird und daher nur 4byte reserviert oder was weiß ich.


Desweiteren muss man immer 8bit shiften ==> 8,16,24(nicht 32)
Antworten