• Domingo 22 de Diciembre de 2024, 19:30

Autor Tema:  Representacion ASCII del valor Hexadecimal 0x00  (Leído 11148 veces)

paultool

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Representacion ASCII del valor Hexadecimal 0x00
« en: Miércoles 17 de Febrero de 2010, 06:21 »
0
Buenas noches amigos,

Tengo el siguiente problema, necesito enviar por un socket una cadena de caracteres la cual es de longuitud variable, para enviarla al host es necesario anteceder la
con 2 bytes hexadecimales en su represantacion ASCII que indican la longuitud de la cadena.

En el siguiente ejemplo la longuitud de la cadena es de 10 caracteres, convirtiendo esto en hexadecimal para formar los 2 bytes de la longuitud obtengo

0x00 en el primer byte
0x0A para el segundo byte

obteniendo el caracter que representa el valor hexadecimal de los bytes obtengo:

  para el primer byte
n    para el segundo byte

la cadena final obtenida es

n23456789

el problema aqui se encuentra al tratar de obtener el caracter que representa al primer byte 0x00, me arroja como resultado el caracter '' si esta cadena la observo desde un editor hexadecimal se ve de la siguiente forma

5C 30 0A 30 31 32 33 34 35 36 37 38 39

lo que busco obtener es

00 0A 30 31 32 33 34 35 36 37 38 39


en su representacion ascii pero c# no me genera el caracter ascci del valor hexadecimal 0x00, si alguien puede ayudarme a obtener la represEntacion ascii del valor hexadecimal 0x00 se los agradecere de antemano


ejemplo:

Código: C#
  1.  
  2. string PostilionMsg="0123456789"
  3.  
  4. //SE OBTIENE LA LONGUITUD DEL MENSAJE EN HEXADECIMAL
  5.  
  6. string PostilionMsgLh = PostilionMsg.Length.ToString("X");
  7. PostilionMsgLh = PostilionMsgLh.PadLeft(4, '0');
  8.  
  9. //CONVIERTE EL VALOR HEXADECIMAL A CARACTER ASCCI
  10.  
  11. byte newByte1 = byte.Parse(PostilionMsgLh.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
  12. byte newByte2 = byte.Parse(PostilionMsgLh.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
  13. char b1 = Convert.ToChar(@System.Convert.ToInt32(newByte2.ToString()));
  14. char b2 = Convert.ToChar(@System.Convert.ToInt32(newByte1.ToString()));
  15.  
  16. PostilionMsg= b1+""+b3+PostilionMsg
  17.  
  18.  
  19.  

tannke

  • Miembro MUY activo
  • ***
  • Mensajes: 152
  • Nacionalidad: es
    • Ver Perfil
Re: Representacion ASCII del valor Hexadecimal 0x00
« Respuesta #1 en: Miércoles 17 de Febrero de 2010, 16:30 »
0
Bueno, primero de todo, decirte que el caracter ascii del valor 0x00 es "null" o sea nada... por lo que no hay caracter... (almenos eso creo)

Por otra parte he estado provando tu fraccion de codigo y a mi (bueno, cambiando el 'PostilionMsg= b1+""+b3+PostilionMsg' por 'PostilionMsg= b2+""+b1+PostilionMsg;') me ha dado como resultado -->    n0123456789

mirando lo que te falla son el  5C y el 30 que deberian ser  00
si miramos la tabla ascii el 5C se corresponde a la '  '  y el 30  al ' 0 '

Solución... bueno la verdad asi no tengo ni idea de como podría ser.
Lo que yo haría es crear una matriz byte tipo:
Código: C#
  1. byte[] buffer = new byte[PostilionMsg.Length+2];
  2.  
en los 2 primeros colcas los bytes de tamaño, en el resto los datos, bueno a lo rapido algo asi:
Código: C#
  1. string PostilionMsg = "0123456789";
  2.  
  3.             //SE OBTIENE LA LONGUITUD DEL MENSAJE EN HEXADECIMAL
  4.              
  5.             string PostilionMsgLh = PostilionMsg.Length.ToString("X");
  6.             PostilionMsgLh = PostilionMsgLh.PadLeft(4, '0');
  7.              
  8.             //CONVIERTE EL VALOR HEXADECIMAL A CARACTER ASCCI
  9.              
  10.             byte newByte1 = byte.Parse(PostilionMsgLh.Substring(0, 2), System.Globalization.NumberStyles.HexNumber);
  11.             byte newByte2 = byte.Parse(PostilionMsgLh.Substring(2, 2), System.Globalization.NumberStyles.HexNumber);
  12.            
  13.  
  14.             byte[] buffer = new byte[PostilionMsg.Length + 2];
  15.  
  16.             byte[] Dato = Encoding.Default.GetBytes(PostilionMsg);
  17.  
  18.             buffer[0] = newByte1;
  19.             buffer[1] = newByte2;
  20.             for (int i = 2; i < buffer.Length; i++)
  21.             {
  22.                 buffer[i] = Dato[i - 2];
  23.             }
  24.  
  25.             ElSocket.Send(buffer);
  26.  

Bueno, en ese ejemplo los caracteres en la matriz quedan representados en su valor decimal .Como nunca he trabajado con datos en hexa ahora mismo no se como cambiarlo, pero supongo que si necesitas forzosamente enviarlo en hexa creo que no será muy complicada la conversión.

Espero te sirva de algo, almenos para darte alguna idea. Saludos