Stringa con numero esadecimale?
#include <iostream> #include <sstream> int main() { std::string msg = "\xb3"; int number; std::istringstream iss (msg, std::istringstream::in); iss >> number; std::cout << std::dec << number << std::endl; return 0; }
Avrei bisogno di stampare il numero $179$ che è contenuto nella stringa msg ma non so come estrarlo. Avete qualche sugerimento?
Grazie!

Risposte
Ciao giuscri, io te l'ho risolto utilizzando lo string stream:
ricordati che utilizzando il formato esadecimale lo "\x" non è riconosciuto dallo stringstream quindi o lo ometti o usi "0x"
int main() { std::string msg = "0xb3"; int number; std::stringstream iss ; iss << std::hex << msg; iss >> number; std::cout << std::dec << number << std::endl; return 0; }
ricordati che utilizzando il formato esadecimale lo "\x" non è riconosciuto dallo stringstream quindi o lo ometti o usi "0x"

@Zurzaza "\xb3" è una stringa di un solo carattere in cui il primo carattere corrisponde al valore esadecimale 0xb3. Corrisponde quindi alla sequenza di due caratteri { 0xb3, 0x00 }. @giuscri è quello che volevi fare?
La richiesta non credo sia comunque molto chiara. Che cosa dovrebbe contenere number? Se vuoi ottenere il valore 0xb3 e poi stamparlo in decimale allora direi che la soluzione corretta è molto semplicemente:
La richiesta non credo sia comunque molto chiara. Che cosa dovrebbe contenere number? Se vuoi ottenere il valore 0xb3 e poi stamparlo in decimale allora direi che la soluzione corretta è molto semplicemente:
std::cout << (unsigned)msg[0] << std::endl;
Grazie ad entrambi per le risposte.
La questione è che sto cercando di risolvere un problema più complesso per il quale però mi sono reso conto di non avere alcuni strumenti di comprensione -e il quale forse non è nemmeno chiaro a me, dato che faccio fatica a spiegarlo.
Forse mi manca qualche competenza "teorica". Facendo come dici tu, scrivendo più o meno:
Ricevo come output:
Forse c'entra il complemento a due? In che modo posso chiarirmi la questione, secondo te?
"apatriarca":
@Zurzaza "\xb3" è una stringa di un solo carattere in cui il primo carattere corrisponde al valore esadecimale 0xb3. Corrisponde quindi alla sequenza di due caratteri { 0xb3, 0x00 }. @giuscri è quello che volevi fare?
La richiesta non credo sia comunque molto chiara. Che cosa dovrebbe contenere number?
La questione è che sto cercando di risolvere un problema più complesso per il quale però mi sono reso conto di non avere alcuni strumenti di comprensione -e il quale forse non è nemmeno chiaro a me, dato che faccio fatica a spiegarlo.
"apatriarca":
Se vuoi ottenere il valore 0xb3 e poi stamparlo in decimale allora direi che la soluzione corretta è molto semplicemente:
std::cout << (unsigned)msg[0] << std::endl;
Forse mi manca qualche competenza "teorica". Facendo come dici tu, scrivendo più o meno:
// ... main() { std::string msg = "\xb3"; std::cout << std::hex; std::cout << (unsigned)msg[0] << std::endl; return 0; }
Ricevo come output:
ffffffb3
Forse c'entra il complemento a due? In che modo posso chiarirmi la questione, secondo te?
Il problema sembra essere che il tuo carattere char viene prima promosso a intero e poi ad unsigned int. La soluzione è quella di convertirlo prima ad unsigned char.
C'è una ragione per cui tu non possa usare un std::vector invece di una stringa? Per quale ragione hai bisogno di una stringa? Puoi rappresentare un valore esadecimale semplicemente usando 0xb3 in C++. Il tuo codice di esempio diventerebbe quindi
Credo sarebbe meglio chiarire il tuo obiettivo finale invece che discutere di questo mini-problema.
#include <iostream> int main() { std::string msg = "\xb3"; unsigned number = (unsigned char)msg[0]; std::cout << number << std::endl; return 0; }
C'è una ragione per cui tu non possa usare un std::vector
std::vector<unsigned char> msg; msg.push_back(0xf5); msg.push_back(0xb3); // now is (msg == {0xf5, 0xb3})
Credo sarebbe meglio chiarire il tuo obiettivo finale invece che discutere di questo mini-problema.