2009-12-30 8 views
6

J'ai un périphérique H/W qui utilise normalement un port série pour une interface, l'envoi et la réception de messages binaires à un programme PC UI. J'ai ajouté un port Ethernet et une petite pile TCP/IP avec un petit serveur Web que je souhaite utiliser pour remplacer l'interface utilisateur du port série par une interface utilisateur de navigateur Web. Les messages sont pour la plupart des requêtes/réponses, mais pour certaines pages web, j'ai besoin de deux ou plusieurs messages Tx/Rx pour obtenir toutes les informations dont j'ai besoin pour la page. Je vais utiliser AJAX XMLHttpRequest() pour envoyer les messages et obtenir les réponses pour une page. Le périphérique H/W a des ressources limitées (CPU & RAM) donc pour rester simple, je veux juste faire une petite interface CGI qui prend les messages sortants et les code comme ASCII HEX (ie deux caractères ASCII HEX)/octet) pour envoyer au navigateur qui utilisera un script Java pour séparer les messages dans des champs et les convertir en variables numériques et les afficher à l'utilisateur. Idem pour les messages envoyés depuis le navigateur vers le périphérique H/W. Les messages contiennent un mélange de types de champs, signés & octets non signés, courts métrages, longs, flottants, et sont compliqués en étant principalement dans l'ordre des petits caractères endian dans les messages.Parse HEX ASCII en nombres?

Je peux gérer le code de fin H/W, mais j'ai du mal à apprendre le script java et je pourrais utiliser l'aide d'une fonction pour traduire les chiffres ASCII < -> à la fin du navigateur.

Des idées? N'importe quel exemple de code où?

Merci, Paul

+0

http: // stackoverflow.com/questions/57803/comment convertir-decimal-en-hex-en-javascript –

Répondre

22

On dirait que vous voulez parseInt. Il prend une chaîne et une base facultative (qui devrait toujours être fournie), et analyse le nombre comme un entier dans cette base (ou une base basée sur le format du nombre si aucun n'est fourni, c'est pourquoi vous devriez toujours fournir un les gens sont surpris de constater que parseInt("010") renvoie 8).

> parseInt("ab", 16) 
171 

Pour reconvertir en hexadécimal, vous pouvez utiliser toString:

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

Notez que vous devrez pad dehors à deux caractères vous-même s'il sort comme un seul caractère:

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

Je me suis ennuyé, j'ai donc écrit quelques fonctions pour faire la conversion dans les deux sens pour vous:

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

qui peut être utilisé comme suit:

> 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

Donc, en utilisant javascript, je voudrais analyser la chaîne ASCII HEX comme un tableau char convertir tous les deux caractères en une chaîne de deux char, puis utiliser parseInt() pour le convertir en un octet et le mettre dans un tableau d'octets résultant dans un tableau d'octets 1/2 de la taille de la chaîne ASCII HEX? Sélectionnez ensuite les octets du tableau d'octets pour chaque champ et gérez l'échange d'octets endian (existe-t-il une fonction pour cela?)? Et pour les messages qui vont dans l'autre sens, quelle est la fonction javascript pour convertir un octet en deux caractères ASCII HEX? BTW, merci beaucoup Paul – Paul

+0

Cela devrait m'aider à démarrer. Merci beaucoup. Maintenant, je dois juste enrouler un peu de gestion de tableau autour d'elle et cela devrait le faire. Merci encore, Paul – Paul

6

Vous êtes à la recherche de la fonction parseInt():

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

avez-vous cherchez quelque chose comme ces 2 fonctions?

<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

Oui, quelque chose comme ça. Fondamentalement, l'idée est de prendre une struct C comme: struct message_1 { double value_1; unsigned long value_2; signed short value_3; char[6] string_1; } et le convertir en une chaîne ASCII HEX et l'envoyer au navigateur où je reconvertir les valeurs individuelles (connaissant la structure basée sur un type de message) et afficher certaines/toutes les données pour l'utilisateur. Merci, Paul – Paul