Stringa con numero esadecimale?

giuscri
#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
Zurzaza
Ciao giuscri, io te l'ho risolto utilizzando lo string stream:

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" :smt023

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? 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;

giuscri
Grazie ad entrambi per le risposte.

"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?


apatriarca
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.
#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 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
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.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.