char->Qstring un zurück

Du bist neu in der Welt von C++? Dann schau hier herein!
Antworten
greenghecco
Beiträge: 24
Registriert: 7. Juli 2010 14:31

char->Qstring un zurück

Beitrag von greenghecco »

Hallo habe eine Hasfunktion, diese erwartet als input char* und die länge als int. Ich habe das Problem das ich im Vorfeld nur einen Qstring habe, welchen den string darstellt, welche der hashfunktion übergeben werden soll, und somit nach char* gecastet werden muss.
Meine includes:

#include <QFile>
#include <QProcess>
#include <QTextStream>
#include <QDebug>
#include "mainwindow.h"
#include <string>
#include <sstream>
das ich hab fologendermaßen gelöst:

Code: Alles auswählen

 QString test_qs = "TEST";
 QByteArray   bytes  = test_qs.toLocal8Bit();
 char *data_t = new char[bytes.size() + 1];
  strcpy(data_t, bytes.data());

das scheint soweit zu funktionieren.


Dies wird nun der Hashfunktion übergeben, welche einen unsigned char* zurückliefert.

Code: Alles auswählen

hashfunk(data_t, strlen(data_t));
Das was ich bis dato zurückbekomme scheint schon nicht korrekt zu sein, bzw nucht richtig formatiert. Da ich den identsichen Code in VS2008 nutze und er dort funktioniert liegts wohl nicht an der funktion selbst.

ICh spiele schon die ganze zeit mit der formatierung rum, krieg aber nicht das ergebnis was ich haben will. Es soll einen 16 byte string als ergebnis enstehen. Im Debug ist zu sehen das ein 16 Bit string vorhanden ist, aber der inhalt varriert. Der string hat das format:

"021\239\123\256\276...\276"
weiss auch nicht sind die flashes hier alles quotes? das würde erklären warum nur das erste zeichen der 16 bytes aus dem array ausgegeben wird. Hier mein code bisher, wo aber nur grütze rauskommt an ende. Ich caste nun schon direkt nach (char*)

Code: Alles auswählen


  char* uzu = (char*)Hashfunk( data_t, strlen(data_t));
 

weiss jemand wie ich das casten muss damit ich wieder einen string aus den werten erhalte?! Es sind auch nicht druckbare zeichen dabei im chararray, aber das sollte ja nicht schlimm sein.

das ganze soll nachher wieder in ein QString, weil ich damit eine Datei öffnen will.
also QString->char*->hashfunk->unsigned char*->char*->QString

Vielen Dank im vorraus[/code]
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

http://doc.qt.nokia.com/4.6/qstring.html#fromAscii z.B.

Abgesehen davon dass in der zu öffnenden Datei natürlich Text stehen muss. Ansosnten ist QString fehlt am Platze
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

Code: Alles auswählen

QString test_qs = "TEST";
 QByteArray   bytes  = test_qs.toLocal8Bit();
 char *data_t = new char[bytes.size() + 1];
  strcpy(data_t, bytes.data()); 
besser:

Code: Alles auswählen

QString test_qs = "TEST";
 QByteArray   bytes  = test_qs.toLocal8Bit();
 /// QByteArray iss schon ne Klasse die chars in entsprechender Form haelt
/// C-Casts sind Böse ! weg damit
unsigned char* uzu = Hashfunk(bytes.ConstData(),bytes.size()); 
was das mit dem rueckgabewert nu auf sich hat, keine Ahnung .... da fehlen informationen.
Normal sollte ein hashfunktion immer eine Kette auf Bytes in uninterpretierter form zurueckgeben.

aber du bekommst nen Zeiger auf den anfang einer Kette, ohne info wie Lang das ding ist ...
ist die laenge durch die Hasfunktion definiert ?
wie lange sind die Daten, auf die der zeiger zeigt, gueltig ? musst du sofort kopieren ?
ergo hat die hasfunktion ein mieses C-Interface, was wahrscheinlich probleme verursachen wird ! wer hat das geschrieben ? wer ist urheber der hash-funktion ?

Prinzipiell wenn weisst wie die daten behandelt musst:
wieder in nen QByteArray ablegen und z.b. mit QByteArray::toHex() in eine darstellbare Zeichenfolge umwandeln

Ciao ...
greenghecco
Beiträge: 24
Registriert: 7. Juli 2010 14:31

Beitrag von greenghecco »

hallo hab einfach std::string eingeführt und kann den code wie im vorfeld benutzen. Ich muss nur noch von string auf Qstring kommen.


Code: Alles auswählen

std::string Test_SS;
QString Test_QS = QString::fromLocal8Bit( Test_SS.c_str() );
hier wird nur das erste zeichen übernommen.

Ick versteh nicht warum sich der "Dussel" so quer stellt, oder welchen denkfehler ich habe. Der String besitzt folgenden symbole:


"x««««««««þîþîþîþ", laut inet sollte doch:

QString Test_QS = QString::fromStdString(Test_SS);

funktionieren. Is mir echt unerklärlich. Das beste ist wenn ich den QString ausgeben steht IMMMER nur x drinne, aber nicht die anderen Zeichen
Zuletzt geändert von greenghecco am 6. Oktober 2010 14:54, insgesamt 1-mal geändert.
RHBaum
Beiträge: 1436
Registriert: 17. Juni 2005 09:58

Beitrag von RHBaum »

std::string Test_SS;
QString Test_QS = QString::fromLocal8Bit( Test_SS.c_str() );
1. ich glaub nicht das
QString Test_QS = QString::fromLocal8Bit( Test_SS.c_str() );
und
QString Test_QS(Test_SS.c_str()); einen logischen unterschied machen wuerden.
Unterschied fromLocal8Bit und fromASCII !

2. sicher das in Test_SS mehr als ein zeichen drinne steht ? mal debuggen !
eigentlich sollte es mit fromLocal8Bit auch gehen. Sicher dass du ned mittendrinn im std::string nen 0Zeichen hasst ?

Generell:
QT harmoniert besser mit QByteArray anstatt std:string. geht zwar beides, aber QByteArray ist mehr QT-like und performanter.
Wenn nicht durch andere Umstaende auf die STL angeweissen bist (Beispielsweisse eine qt freie hash-implementierung) solltest auch QByteArray nehmen....

Apropo hash ....
ich hoffe du versuchst nicht einfach deinen hash Wert einen string zuzuweisen. HashWert = Array aus Bytes, wo der ganze bereich (-128...127) genutzt werden.
Strings (ASCII) gehen nur von 0...127, und viele haben eine besondere bedeutung.
Um eine Folge aus Bytes auf einem Medium mittels Buchstaben (Strings) auszugeben, muss man die in eine Darstellbare Form konvertieren !!!!!
Hexadezimale Darstellung ala 00 AC 87 34 (mit oder ohne Leerzeichen) ist nur eine mögliche ....

Ciao ...
greenghecco
Beiträge: 24
Registriert: 7. Juli 2010 14:31

Beitrag von greenghecco »

hab ich. also in VS2008 stellt sich da auch nicht quer, die Steuerzeichen 0-31 werden auch in int vorher umgeformt.

also im String siehst so aus:

"x\ab\ab\ab\ab\ab\ab\ab\ab\fe\ee\fe\ee\fe\ee\fe"
was dem oben beschrieben entsprechen würde. Ich nehme an er bricht immer nach dem ersten zeichen ab wegen \ wie krieg ich das ganze sauber in einen QString.

Im Debugmodus scheint es zu funktionieren.

ich hab alle zeichen des chars enzeln ausgegeben und dann nochmal den Qstring, da passte die ausgabe. Aber im normalen modus ist im QString nur das erste zeichen, muss ich irgendwie die STL einbinden?
Antworten