string zu byte
-
Guten Tag,
ich habe von einer externen Quelle zwei Zeichen in einem string z. B. test = "FF";
Nun möchte ich daraus ein byte haben. Also BYTE byte = '\xFF';
Wie löse ich das Problem am Besten?
Wenn ich mir daraus einen char* hole z. B. const char* chartest = test.c_str();
ist chartest[0] F und chartest[1] F. Aber wie wandle ich die beiden nun in ein byte[0] = \xFF?
-
Mein Vorschlag: ein Stringstream im Hexadezimal-Modus.
-
<iomanip>hatstd::ios_base::hex.MfG, EOutOfResources
EDIT: Mann, zu langsam...
-
wäre gut jo
BYTE toByte(std::string const & str) { std::stringstream ss; ss << hex << str; BYTE b; ss >> b; return b; }ich schreibe die funktion deshalb, weil ich mir bei den stream operatoren selsbt nicht sicher bin (eig fast gar nicht) und wissen möchte ob das richtig ist so
-
Skym0sh0 schrieb:
BYTE toByte(std::string const & str) { std::stringstream ss; ss << hex << str; BYTE b; ss >> b; return b; }Fail-Bit prüfen und ggf. werfen.
-
Hallo,
danke für eure Antworten.
Leider funktioniert das so nicht.
Es würde nur klappen wenn es z. B. std::string s = "\xFF"; wäre.Das Problem ist, die BYTES werden in dem string nicht als bytes interpretiert. Also steht eigentlich \\xFF im Speicher. string[0] = \ string[1] = x string[2] = F und so weiter.
-
Das Auslesen soll doch als 'hex' geschehen, also:
BYTE toByte(std::string const & str) { std::stringstream ss; ss << str; BYTE b; ss >> hex >> b; return b; }Evtl noch "0x" vorher in den Stream schreiben, also "ss << "0x" << str"...
Ich persönlich nutze aber eigentlich immer diese Variante:
std::istringstream ss(str); BYTE b; ss >> hex >> b; return b;bzw allgemein als Template:
template<typename T> T fromStr(const string &str) { std::istringstream is(str); T t = T(); is >> t; return t; }Und die Variante mit 'hex' kann sich nun jeder selbst basteln...
-
Wie gesagt, leider kann ich das Problem so nicht lösen, da die bytes nicht als bytes interpretiert werden, sondern als string.
Beispiel:
std::string str = "FF"; ss << str; BYTE b; ss >> std::hex >> b; // b is not 0xFF but 0x46 'F'
-
Old school:
unsigned char c = 16 * ( str[1] - ('F' - 15)) + (str[0] - ('F' - 15));Sofern Großschreibung garantiert. Sonst noch sowas wie toupper().
-
Caligulaminus schrieb:
Old school:
unsigned char c = 16 * ( str[1] - ('F' - 15)) + (str[0] - ('F' - 15));Sofern Großschreibung garantiert. Sonst noch sowas wie toupper().
Klappt nicht mit den Ziffern 0-9.
-
Hallo Epsylon,
stimmt, 'BYTE' ist ja '[unsigned] char'.
Lese es einfach als 'int' aus dem Stream und konvertiere es anschließend nach BYTE.
-
@Michael E.: Upps... danke.
Lesen mit einem Auge und halbem Hirn führt eben doch zu Schwachsinn.
unsigned char c = 16 * str[1] > '9' ? (str[1] - ('F' - 15)) : (str[1] - '0') + str[0] > '9' ? (str[0] - ('F' - 15)) : (str[0] - '0');Jetzt wirds aber auch wirklich unübersichtlich.

-
#include <cctype> #include <stdexcept> inline int hexvalue(char c) { if(!std::isxdigit(c)) { throw std::invalid_argument("Keine hexadezimale Ziffer"); } return std::isdigit(c) ? c - '0' : std::tolower(c) - 'a' + 10; } unsigned char c = hexvalue(str[0]) * 16 + hexvalue(str[1]);?
-
Caligulaminus schrieb:
@Michael E.: Upps... danke.
Lesen mit einem Auge und halbem Hirn führt eben doch zu Schwachsinn.
unsigned char c = 16 * str[1] > '9' ? (str[1] - ('F' - 15)) : (str[1] - '0') + str[0] > '9' ? (str[0] - ('F' - 15)) : (str[0] - '0');Jetzt wirds aber auch wirklich unübersichtlich.

Wenn schon ASCII-abhängig, dann richtig

cout << 16 * ((str[0] & 15) + 9 * !!(str[0] & 64)) + (str[1] & 15) + 9 * !!(str[1] & 64);
-
Michael E. schrieb:
cout << 16 * ((str[0] & 15) + 9 * !!(str[0] & 64)) + (str[1] & 15) + 9 * !!(str[1] & 64);Und dazu noch case insensitive (gibt's dafür 'nen schönen deutschen Ausdruck?).
Viel besser!

-
Vielen Dank Michael E.! Die Lösung funktioniert super!
Hoffentlich ist das bugfrei, denn ich hab keine Ahnung was da abgeht
Danke auch an Caligulaminus und seldon
Epsylon
-
Meine Lösung war eigentlich nur als Witz gedacht, denn sie verlässt sich auf den ASCII-Zeichensatz und ist ziemlich unintuitiv
Aber na gut, wenns um Geschwindigkeit geht und man die Zeile gut kommentiert, kann man das akzeptieren.
-
Und außerdem dürfte sie auch alle ungültigen Zeichen berarbeiten (was sicher nicht im Sinne des Erfinders ist). Wenn du etwas verwertbares haben willst, sind die Antworten von Th69 und seldon vermutlich brauchbarer.
-
hi,
Die Lösung funktioniert super, ich habe 3 Tage schon versucht es zu lösen.
Die Daten sind ja immer im ASCII Zeichensatz, weil ich sie aus der Datei lese.
Und ich kann garantieren, dass keine ungültigen Zeichen dabei sind.
-
Na wenn du unbedingt Programme schreiben willst, die du selber in einem Monat nicht mehr lesen kannst, wünsche ich dir viel Glück
Du solltest trotzdem mal versuchen herauszufinden, WARUM diese Formel das macht was sie soll - und was herauskommt, wenn du ihr z.B. die Eingabe 'GG' vorsetzt.