2009-12-30 9 views
6

Mam urządzenie H/W, które normalnie używa portu szeregowego do interfejsu, wysyłając i odbierając komunikaty binarne do programu interfejsu użytkownika komputera. Dodałem port Ethernet i mały stos TCP/IP z małym serwerem WWW, którego chcę użyć, aby zastąpić interfejs portu szeregowego interfejsem przeglądarki internetowej.Parse HEX ASCII na liczby?

Wiadomości są w większości sprawami typu żądanie/odpowiedź, ale w przypadku niektórych stron internetowych muszę potrzebować Tx/Rx dwóch lub więcej wiadomości, aby uzyskać wszystkie informacje potrzebne do strony. Będę używał AJAX XMLHttpRequest() do wysyłania wiadomości i otrzymywania odpowiedzi na stronę.

Urządzenie H/W ma ograniczone zasoby (CPU & RAM), więc na samym końcu chcę stworzyć mały interfejs CGI, który pobiera wiadomości wychodzące i koduje je jako HEX ASCII (tj. Dwa znaki ASCII HEX)/byte), aby wysłać do przeglądarki, która użyje jakiegoś skryptu java, aby rozdzielić wiadomości na pola i przekonwertować je na zmienne numeryczne i wyświetlić je użytkownikowi. To samo dotyczy wiadomości wysyłanych z przeglądarki do urządzenia H/W.

Wiadomości zawierają mieszankę typów pól, podpisane & niepodpisanych bajtów, szortów, longów, spławików, a ponadto są bardziej skomplikowane, ponieważ w wiadomościach znajdują się głównie w małej kolejności bajtów endianowych.

Potrafię obsłużyć kod końca H/W, ale staram się nauczyć skryptu java i mogę skorzystać z pomocy funkcji do tłumaczenia HEX ASCII < -> numerycznych na końcu przeglądarki.

Wszelkie pomysły? Dowolny przykład kodu gdzieś?

Dzięki Paul

+0

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

Odpowiedz

22

Brzmi jak chcesz parseInt. Przyjmuje łańcuch i opcjonalną podstawkę (która zawsze powinna być dostarczona) i analizuje liczbę jako liczbę całkowitą w tej podstawce (lub podstawą w oparciu o format liczby, jeśli żadna z nich nie jest dostarczana, dlatego zawsze powinieneś podać jedną ; ludzie są zaskoczeni, że parseInt("010") zwraca 8).

> parseInt("ab", 16) 
171 

Aby przekonwertować z powrotem do hex, można użyć toString:

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

Należy pamiętać, że trzeba będzie pad ją do dwóch znaków siebie, czy to wychodzi jak tylko jeden znak:

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

byłem znudzony, więc napisałem kilka funkcji, aby wykonać konwersję w obu kierunkach dla Ciebie:

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

które mogą być wykorzystane w następujący sposób:

> 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

Używając javascript, parsowałbym ciąg znaków ASCII HEX jako tablicę char, konwertując co dwa znaki na ciąg dwóch znaków, a następnie użyj parseInt(), aby przekonwertować go na bajt i umieścić go w tablicy bajtów, w wyniku czego tablica bajtowa 1/2 rozmiar łańcucha znaków ASCII HEX? Następnie wybierz bajty z tablicy bajtów dla każdego pola i obsłuż zamienianie bajtów endianów (czy jest w tym funkcja?)? A dla wiadomości idących w drugą stronę, jaka jest funkcja javascript do konwersji bajtu na dwa znaki HEX ASCII? BTW, wielkie dzięki Paul – Paul

+0

To powinno pomóc mi zacząć. Wielkie dzięki. Teraz muszę po prostu owijać niektóre tablice i to powinno. Jeszcze raz dziękuję, Paul – Paul

6

Szukacie funkcji parseInt():

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

nie szukasz czegoś podobnego tych 2 funkcji?

<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

Tak, coś w tym stylu. Zasadniczo pomysł jest do podjęcia C struct jak: struct message_1 { double value_1; unsigned long value_2; signed short value_3; char[6] string_1; } i przekonwertować go na ciąg HEX ASCII i wysłać go do przeglądarki, gdzie mogę przekonwertować go z powrotem do indywidualnych wartości (znając strukturę w oparciu o typ wiadomości) i wyświetlić niektóre/wszystkie dane dla użytkownika. Dzięki, Paul – Paul