Разобрать HEX ASCII в числа?

У меня есть устройство H/W, которое обычно использует последовательный порт для интерфейса, отправляя и получая двоичные сообщения в программу пользовательского интерфейса ПК. Я добавил порт Ethernet и небольшой стек TCP/IP с небольшим веб-сервером, который я хочу использовать для замены пользовательского интерфейса последовательного порта пользовательским интерфейсом веб-браузера.

Сообщения в основном представляют собой запросы/ответы, но для некоторых веб-страниц мне может потребоваться отправить/получить два или более сообщений, чтобы получить всю информацию, необходимую для страницы. Я буду использовать AJAX XMLHttpRequest() для отправки сообщений и получения ответов для страницы.

Устройство H/W имеет ограниченные ресурсы (ЦП и ОЗУ), поэтому, чтобы упростить его, я хочу просто создать небольшой интерфейс CGI, который принимает исходящие сообщения и кодирует их как HEX ASCII (т.е. два символа HEX ASCII/байт) для отправить в браузер, который будет использовать некоторый java-скрипт, чтобы разделить сообщения на поля и преобразовать их в числовые vars и отобразить их пользователю. То же самое для сообщений, отправленных из браузера на устройство H/W.

Сообщения содержат смесь типов полей, байтов со знаком и без знака, коротких, длинных, плавающих и еще более усложняются тем, что в сообщениях в основном используется порядок байтов с прямым порядком байтов.

Я могу обрабатывать конечный код H/W, но я изо всех сил пытаюсь изучить java-скрипт и мог бы использовать помощь с функцией для перевода числовых значений HEX ASCII ‹-> в конце браузера.

Любые идеи? Какой-нибудь пример кода где-нибудь?

Спасибо, Пол.


person Paul    schedule 30.12.2009    source источник
comment
stackoverflow.com/ вопросы/57803/   -  person J.J.    schedule 30.12.2009


Ответы (3)


Похоже, вам нужен parseInt. Он принимает строку и необязательную систему счисления (которая всегда должна быть предоставлена) и анализирует число как целое число в этой системе счисления (или систему счисления на основе формата числа, если ничего не указано, поэтому вы всегда должны указывать один ; люди с удивлением обнаруживают, что parseInt("010") возвращает 8).

> parseInt("ab", 16)
171

Чтобы преобразовать обратно в шестнадцатеричный формат, вы можете использовать toString:

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

Обратите внимание, что вам придется самостоятельно дополнить его двумя символами, если он будет состоять только из одного символа:

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

Мне было скучно, поэтому я написал несколько функций для преобразования в обоих направлениях для вас:

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

Который можно использовать следующим образом:

> 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]
person Brian Campbell    schedule 30.12.2009
comment
Таким образом, используя javascript, я бы проанализировал строку ASCII HEX как массив символов, преобразуя каждые два символа в строку из двух символов, а затем использовал parseInt(), чтобы преобразовать ее в байт и поместить в массив байтов, что привело к массиву байтов 1/ 2 размер строки ASCII HEX? Затем выберите байты из массива байтов для каждого поля и обработайте перестановку байтов с порядком байтов (есть ли функция для этого?)? А для сообщений, идущих в другую сторону, какая функция javascript для преобразования байта в два символа ASCII HEX? Кстати, большое спасибо Павел - person Paul; 30.12.2009
comment
Это должно помочь мне начать. Большое спасибо. Теперь мне просто нужно обернуть вокруг него некоторую обработку массива, и это должно сделать это. Еще раз спасибо, Пол - person Paul; 30.12.2009

Вы ищете функцию parseInt():

x = "0xff";
y = parseInt(x, 16);
alert(y);   //255
person J.J.    schedule 30.12.2009

Вы искали что-то вроде этих двух функций?

<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>
person Michel Gokan Khan    schedule 30.12.2009
comment
Да, что-то в этом роде. В основном идея состоит в том, чтобы взять структуру C, например: ‹code› struct message_1 { double value_1; беззнаковое длинное значение_2; подписанное короткое значение_3; символ[6] строка_1; } ‹/code› и преобразовываю его в строку HEX ASCII и отправляю в браузер, где я преобразовываю его обратно в отдельные значения (зная структуру, основанную на типе сообщения) и отображаю некоторые/все данные для пользователя. Спасибо, Пол. - person Paul; 30.12.2009