std :: hex no funciona como espero -- ++ camp Relacionados El problema

std::hex does not work as I expect


3
vote

problema

Español

No estoy acostumbrado a C ++, así que soportar conmigo ...

Dos bytes se leen de un dispositivo y se ponen en un búfer. Luego se imprime.

Se supone que el código a continuación devolverá la cadena "0x204D" Sin embargo, devuelve "0x M" que en Hex es 30 78 20 4d

Entonces, el hex no se decodifica a ASCII.

  void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen) {     std::stringstream *decodedClearText;     decodedClearText = new std::stringstream;      *decodedClearText << "0x" << std::hex;      for (int i=0; i<bufferLen; i++) {             *decodedClearText << buffer[i];     }     setValue(decodedClearText->str()); }   

¿Cómo se debe hacer?

Original en ingles

I'm not used to C++, so bear with me...

Two bytes are read from a device and gets in a buffer. It is then to be printed.

The code below is supposed to return the string "0x204D" However, it returns "0x M" which in hex is 30 78 20 4d

So the hex is not decoded to ascii.

void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen) {     std::stringstream *decodedClearText;     decodedClearText = new std::stringstream;      *decodedClearText << "0x" << std::hex;      for (int i=0; i<bufferLen; i++) {             *decodedClearText << buffer[i];     }     setValue(decodedClearText->str()); } 

How should it be done?

  
     
     

Lista de respuestas

5
 
vote

Esto no tiene nada que ver con std::hex .

Cuando transmita un [signed/unsigned] char , se usa su representación ASCII, ya que es generalmente lo que se espera de char S.

Puede transmitir un número en su lugar convirtiéndolo a int6 . Luego, la característica que hace que los números en la notación hexadecimal (I.E. 9988777667 ) se activará.

También debe reparar esa pérdida de memoria y asignación dinámica innecesaria:

  void vito_unit::decodeAsRaw(unsigned char const* const buffer, int const bufferLen) {     std::stringstream decodedClearText;     decodedClearText << "0x" << std::hex;      for (int i = 0; i < bufferLen; i++) {        decodedClearText << +buffer[i];     }      setValue(decodedClearText.str()); }   

El unario "+" realiza una promoción integral a int .

 

This has nothing to do with std::hex.

When you stream a [signed/unsigned] char, its ASCII representation is used, because that is usually what is expected of chars.

You can stream a number instead by converting it to int. Then the feature that renders numbers in hexadecimal notation (i.e. std::hex) will be triggered.

You should also fix that memory leak and unnecessary dynamic allocation:

void vito_unit::decodeAsRaw(unsigned char const* const buffer, int const bufferLen) {     std::stringstream decodedClearText;     decodedClearText << "0x" << std::hex;      for (int i = 0; i < bufferLen; i++) {        decodedClearText << +buffer[i];     }      setValue(decodedClearText.str()); } 

The unary "+" performs an integral promotion to int.

 
 
   
   
3
 
vote

convert0 es de tipo convert11111/, por lo tanto, se imprime como un carácter en lugar de su representación hexadecimal. Puede emitir el valor a un convert2 para evitar eso.

  convert3  
 

buffer[i] is of type unsigned char and is thus printed as a character instead of its hexadecimal representation. You can cast the value to an unsigned int to avoid that.

void vito_unit::decodeAsRaw(unsigned char *buffer, int bufferLen) {     std::stringstream *decodedClearText;     decodedClearText = new std::stringstream;      *decodedClearText << "0x" << std::hex;      for (int i=0; i<bufferLen; i++) {             *decodedClearText << (unsigned int) buffer[i];     }     setValue(decodedClearText->str()); } 
 
 
3
 
vote

La pista de Bo Persson fue lo que necesitaba.

  convert4  

hice el truco.

 

The hint from Bo Persson was what I needed.

 for (int i=0; i<bufferLen; i++) {         *decodedClearText << (int)buffer[i]; } 

did the trick.

 
 
   
   

Relacionados problema

64  Montón de corrupción bajo Win32; ¿Cómo localizar?  ( Heap corruption under win32 how to locate ) 
Estoy trabajando en una aplicación de MultiShreaded que está corrompiendo el montón. Las herramientas habituales para localizar esta corrupción parecen ser ...

30  Asegurar que las excepciones siempre sean atrapadas  ( Ensuring that exceptions are always caught ) 
Las excepciones en C ++ no deben ser atrapadas (sin errores de tiempo de compilación) por la función de llamada. Así que depende del juicio del desarrollador,...

30  ¿Soporte de expresión regular fácil de usar en C ++? [cerrado]  ( Easy to use regular expression support in c ) 
cerrado. Esta pregunta no cumple con pautas de desbordamiento de pila . Actualmente no está aceptando respuestas. ...

22  ¿Construir para Windows NT 4.0 usando Visual Studio 2005?  ( Build for windows nt 4 0 using visual studio 2005 ) 
Una aplicación de MFC que estoy tratando de migrar usos afxext.h , que causa 9988777664 para configurar, lo que causa este error si configuro /MT5 : Ut...

42  Generación de números aleatorios robustos [cerrado]  ( Robust random number generation ) 
Según lo que actualmente representa, esta pregunta no es un buen ajuste para nuestro Q & Amp; un formato. Esperamos que las...

19  ¿Qué herramienta de integración continua es la mejor para un proyecto C ++? [cerrado]  ( What continuous integration tool is best for a c project ) 
cerrado . Esta pregunta es basada en opinión . Actualmente no está aceptando respuestas. Cerrado ha...

27  ¿Comunicación de cliente-cliente de múltiples direcciones asíncrona en el mismo socket abierto?  ( Asynchronous multi direction server client communication over the same open sock ) 
Tengo una aplicación cliente-servidor donde el cliente está en un dispositivo Windows Mobile 6, escrito en C ++ y el servidor está en Windows completo y escri...

164  Cómo usar la API de C Socket en C ++ en Z / OS  ( How to use the c socket api in c on z os ) 
Tengo problemas para que la API de los sockets de C funcione correctamente en C ++ en Z / OS. Aunque estoy incluyendo sys/socket.h , Sigo obtengo los error...

35  Berkeleydb concurrencia  ( Berkeleydb concurrency ) 
¿Cuál es el nivel óptimo de concurrencia de que la implementación de C ++ de BerkeleyDB puede apoyar razonablemente? ¿Cuántos hilos puedo haber golpeado la...

56  ¿Debo usar clases anidadas en este caso?  ( Should i use nested classes in this case ) 
Estoy trabajando en una colección de clases utilizadas para la reproducción de video y la grabación. Tengo una clase principal que actúa como la interfaz públ...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos