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.