2009-12-30 14 views
6

Tengo un dispositivo H/W que normalmente usa un puerto serie para una interfaz, enviando y recibiendo mensajes binarios a un programa de interfaz de usuario de la PC. He agregado un puerto Ethernet y una pequeña pila de TCP/IP con un pequeño servidor web que quiero usar para reemplazar la interfaz de usuario del puerto serie con la interfaz de usuario de un navegador web.Parse HEX ASCII en números?

Los mensajes son principalmente de tipo solicitud/respuesta, pero para algunas páginas web puedo necesitar Tx/Rx dos o más mensajes para obtener toda la información que necesito para la página. Usaré AJAX XMLHttpRequest() para enviar los mensajes y obtener las respuestas para una página.

El dispositivo H/W tiene recursos limitados (CPU & RAM) así que para simplificarlo, solo quiero hacer una pequeña interfaz CGI que tome los mensajes salientes y los codifique como HEX ASCII (es decir, dos caracteres HEX ASCII/byte) para enviar al navegador que usará algunos guiones java para separar los mensajes en campos y convertirlos a valores numéricos y mostrarlos al usuario. Lo mismo para los mensajes enviados desde el navegador al dispositivo H/W.

Los mensajes contienen una combinación de tipos de campo, & bytes sin firmar, cortos, largos, flotantes, y son más complicados por estar en su mayoría en orden de bytes poco endian en los mensajes.

Puedo manejar el código final H/W, pero estoy luchando para aprender el script java y podría utilizar la ayuda con una función para traducir HEX ASCII < -> numéricos en el navegador.

¿Alguna idea? ¿Algún código de ejemplo en algún lugar?

Gracias, Paul

+0

http: // stackoverflow.com/questions/57803/how-to-convert-decimal-to-hex-in-javascript –

Respuesta

22

Suena como desea parseInt. Toma una cadena y una base opcional (que siempre se debe proporcionar), y analiza el número como un número entero en esa base (o una base basada en el formato del número si no se proporciona ninguna, razón por la cual siempre debe suministrar una ; las personas se sorprenden al descubrir que parseInt("010") devuelve 8).

> parseInt("ab", 16) 
171 

Para convertir de nuevo a hexadecimal, puede utilizar toString:

> var num = 16 
> num.toString(16) 
"10" 

Tenga en cuenta que tendrá que rellenarlo a dos personajes a sí mismo si se trata como un solo personaje:

> num = 5 
> num.toString(16) 
"5" 

me aburría, así que escribió algunas funciones para hacer la conversión en ambas direcciones para usted:

function parseHexString(str) { 
    var result = []; 
    // Ignore any trailing single digit; I don't know what your needs 
    // are for this case, so you may want to throw an error or convert 
    // the lone digit depending on your needs. 
    while (str.length >= 2) { 
     result.push(parseInt(str.substring(0, 2), 16)); 
     str = str.substring(2, str.length); 
    } 

    return result; 
} 

function createHexString(arr) { 
    var result = ""; 
    for (i in arr) { 
     var str = arr[i].toString(16); 
     // Pad to two digits, truncate to last two if too long. Again, 
     // I'm not sure what your needs are for the case, you may want 
     // to handle errors in some other way. 
     str = str.length == 0 ? "00" : 
       str.length == 1 ? "0" + str : 
       str.length == 2 ? str : 
       str.substring(str.length-2, str.length); 
     result += str; 
    } 

    return result; 
} 

que puede ser utilizado de la siguiente manera:

> parseHexString("abcd100001") 
[171, 205, 16, 0, 1] 
> createHexString([0, 1, 2, 10, 20, 100, 200, 255, 1000, 2000]) 
"0001020a1464c8ffe8d0" 
> parseHexString(createHexString([0, 1, 2, 10, 20, 100, 200, 255, 1000, 2000])) 
[0, 1, 2, 10, 20, 100, 200, 255, 232, 208] 
+0

Utilizando javascript, analizaría la cadena ASCII HEX como una matriz char convirtiendo cada dos caracteres en una cadena de dos caracteres, luego usaré parseInt() para convertirlo en un byte y ponerlo en una matriz de bytes que da como resultado una matriz de bytes 1/2 del tamaño de la cadena ASCII HEX? A continuación, seleccione los bytes de la matriz de bytes para cada campo y gestione el intercambio de bytes endian (¿hay alguna función para eso?)? Y para los mensajes que van en dirección opuesta, ¿cuál es la función javascript para convertir un byte en dos caracteres ASCII HEX? BTW, muchas gracias Paul – Paul

+0

Eso debería ayudarme a comenzar. Muchas gracias. Ahora solo tengo que ajustar el manejo de una matriz y debería hacerlo. Gracias de nuevo, Paul – Paul

6

Usted está buscando la función parseInt():

x = "0xff"; 
y = parseInt(x, 16); 
alert(y); //255 
3

hicieron que buscando algo como estas 2 funciones?

<html> 
    <head> 
    <script type="text/javascript"> 
     function hex2Decimal(hex) 
     { 
      return parseInt("0x"+hex); 
     } 

     function decimal2Hex(num) 
     { 
      return num.toString(16); 
     } 
    </script> 

    </head> 
    <body> 

     <script type="text/javascript"> 
      document.write(hex2Decimal("A") + "<br />"); 
      document.write(decimal2Hex(16) + "<br />"); 
     </script> 
    </body> 
</html> 
+0

Sí, algo así. Básicamente la idea es tomar una estructura C como: struct message_1 { double value_1; unsigned long value_2; signed short value_3; char[6] string_1; } y convertirlo en una cadena HEX ASCII y enviarlo al navegador dónde puedo convertir de nuevo a los valores individuales (conocer la estructura basada en un tipo de mensaje) y mostrar algunos/todos los datos para el usuario. Gracias, Paul – Paul