Seite 1 von 1
[gelöst]QByteArray nach Integer konvertieren....
Verfasst: 23. November 2009 13:08
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?
Verfasst: 23. November 2009 13:36
von pfid
Was stimmt nicht mit
http://qt.nokia.com/doc/4.5/qbytearray.html#toInt ? Oder steh ich auch im Wald?
Re: QByteArray nach Integer konvertieren....
Verfasst: 23. November 2009 14:10
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.
Verfasst: 23. November 2009 14:25
von AuE
sch**ße ja

thx!
Verfasst: 23. November 2009 14:27
von RavenIV
AuE hat geschrieben:sch**ße ja

thx!
Warum eigentlich nicht QByteArray.toInt()?
Dann sparst Du Dir das ganze shifting.
Verfasst: 23. November 2009 14:29
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?
Verfasst: 23. November 2009 14:52
von AuE
Nur einen Satz aus der RFC 1952 (GZIP Format) verstehe ich nich
ISIZE

nput 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!
Verfasst: 23. November 2009 15:23
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!
Verfasst: 23. November 2009 15:35
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)