[qt 4.1.2] QByteArray->replace will nicht, wie es soll

Alles rund um die Programmierung mit Qt
Antworten
hansii
Beiträge: 4
Registriert: 9. Mai 2006 23:12

[qt 4.1.2] QByteArray->replace will nicht, wie es soll

Beitrag von hansii »

schoenen guten abend :)

wie schon im titel genannt, habe ich ein problem mit der replace funktion

Code: Alles auswählen

QByteArray & QByteArray::replace ( int pos, int len, const char * after )
dabei erstelle mittels

Code: Alles auswählen

QByteArray tmp = QByteArray::QByteArray(512, 0x00);
ein mit 0x00 gefuelltes QByteArray (512Byte)

mit der nachfolgenden funktion soll bei aufruf mit entsprechenden parametern zb.

Code: Alles auswählen

writeSuBlock(&tmp, 16*1024, Time_t, name, 4, 0, 0);

Code: Alles auswählen

void writeSuBlock(QByteArray *tmp, size_t clustersize, size_t thetime, QString name, size_t maxsize, size_t frcount, size_t nodecount)
{
	tmp->replace(0, 4, (const char *)&thetime);
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 1: %1 - %2").arg(tmp->size()).arg(thetime), 1, 0, 0);
	
	tmp->replace(4, 4, (const char *)&nodecount);
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 2: %1 - %2").arg(tmp->size()).arg(nodecount), 1, 0, 0);
	
	tmp->replace(8, 4, (const char *)&clustersize);
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 3: %1 - %2").arg(tmp->size()).arg(clustersize), 1, 0, 0);
	
	tmp->replace(12, name.size(), name.toLatin1());
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 4: %1 - %2").arg(tmp->size()).arg(name), 1, 0, 0);
		
	tmp->replace(267, 4, (const char *)&frcount);
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 5: %1 - %2").arg(tmp->size()).arg(frcount), 1, 0, 0);

	tmp->replace(271, 4, (const char *)&maxsize);
	QMessageBox::warning(NULL, QString::fromUtf8("nufs v%1").arg(VERSION), QString::fromUtf8("size of tmp 6: %1 - %2").arg(tmp->size()).arg(maxsize), 1, 0, 0);
}
das problem ist jetzt, dass das ergebnis in meinen augen recht unverstaendlich ist, da das array

a) auf 502 byte schrumpft
b) werte teilweise nicht geschrieben wurden
c) positionen teilweise nicht stimmen
d) etc.

meine frage ist daher:

was mache ich falsch *g

als ergebnis soll ein 512 byte grosses qbytearray entstehen wobei
- die ersten 4 bit die uebergebene zeit
- die naechsten die uebergebene zahl 0
- die naechsten die uebergebene clustergroesse
- etc.
enthalten sollen

ich hoffe, mir kann jmd helfen :)

mfg
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

Zumindest "tmp->replace(12, name.size(), name.toLatin1()); " ist falsch --> tmp->replace(12, name.size(), name.toLatin1().constData());
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
hansii
Beiträge: 4
Registriert: 9. Mai 2006 23:12

Beitrag von hansii »

hm .. also der string kam an (quasi stand richtig & auch an der richtigen position) .. genauso wie die zeit, aber danke fuer den hinweis

was ich vermute ist, dass die teilweise vorkommenden 0x00 als terminierung gewertet werden .. koennte das sein, und wenn ja, wie kann man es umgehen ?
Shadow
Beiträge: 92
Registriert: 27. August 2005 18:15
Wohnort: Iserlohn
Kontaktdaten:

Beitrag von Shadow »

hansii hat geschrieben:hm .. also der string kam an (quasi stand richtig & auch an der richtigen position) .. genauso wie die zeit, aber danke fuer den hinweis

was ich vermute ist, dass die teilweise vorkommenden 0x00 als terminierung gewertet werden .. koennte das sein, und wenn ja, wie kann man es umgehen ?
0x00 wird von Qt als solches nicht terminiert, dafür bräuchtest du "\0". Die Replace-Funktion kommt mir aber verdächtig vor und zwar dahingehend, dass du anstatt "replace(8,4,...)" mal "replace(9,4,..)" verwenden solltest, da zuvor ja schon durch "replace(4,4,..)" bis Position 8 geschrieben wird und vielleicht dadurch hier und da ein Byte verschluckt wird.
hansii
Beiträge: 4
Registriert: 9. Mai 2006 23:12

Beitrag von hansii »

das qbytearray geht ja von 0-511 (bei 512 byte)

quasi geht replace(4,4,..) ueber die indize 4,5,6,7 und replace(8,4,..) schliesst sich dem an :)

das lustige ist ja wie gesagt, dass die zeit, welche wesentlich groesser ist als die restlichen werte (aktuell: 1147253834) und kein 0x00 enthaelt, korrekt geschrieben wird ..

der wert fuer size mit dem ich teste ist 16k = 0x00004000 .. hat quasi als erstes ein 0x00 (wird ja von hinten an geschrieben) und wird nicht korrekt geschrieben

nehme ich 100 (0x00000064) oder 200 (0x000000c8) stehen diese korrekt drin, aber die groesse des arrays sinkt um 3 byte (quasi wird jeweils nur 1 byte geschrieben aber 4 byte damit ersetzt)

daher meine ueberlegung mit dem 0x00 ..

alles in allem komisch :D

hier mal ein ausschnitt des ergebnisses

Code: Alles auswählen


// die positionen :>

#define SUTIMEPOS 0
#define SUNODESIZEPOS 4
#define SUCLUSTERSIZEPOS 8
#define SUNAMEPOS 12
#define SUFRAGCOUNTPOS 267
#define SUMAXSIZEPOS 271

// die ausgabe

04 B6 61 44 C8 00 00 00 00 00 00 00 45 3A 2F 70 
72 6F 6A 65 63 74 73 2F 62 73 79 2F 66 73 2F 6E 
75 66 73 2F 72 65 6C 65 61 73 65 2F 31 2E 6E 75 
66 73 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 64 00 00 00 04 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 
00 00 00 00 00 00 

hansii
Beiträge: 4
Registriert: 9. Mai 2006 23:12

Beitrag von hansii »

habs .. :D

Code: Alles auswählen

QByteArray _tmp = QByteArray::fromRawData((const char *)&thetime, sizeof((const char *)&thetime));
	tmp->replace(SUTIMEPOS, 4, _tmp);
geht - kann als geloest markiert werden :)

mfg
Antworten