将HEX ASCII解析为数字?

时间:2009-12-30 18:46:57

标签: javascript parsing ascii hex

我有一个H / W设备,它通常使用串行端口作为接口,向PC UI程序发送和接收二进制消息。我添加了一个以太网端口和小型TCP / IP堆栈,其中包含一个小型Web服务器,我想用它来用Web浏览器UI替换串口UI。

消息主要是请求/响应排序,但对于某些网页,我可能需要Tx / Rx两条或更多消息来获取页面所需的所有信息。我将使用AJAX XMLHttpRequest()发送消息并获取页面的响应。

H / W设备具有有限的资源(CPU和RAM),所以为了保持简单,我想制作一个接收传出消息的小CGI接口并将它们编码为HEX ASCII(即两个HEX ASCII字符) / byte)发送到浏览器,该浏览器将使用一些java脚本将消息分离到字段中并将它们转换为数字变量并将其显示给用户。对于从浏览器发送到H / W设备的消息也是如此。

消息包含字段类型的混合,签名&无符号字节,短路,长整数,浮点数,并且通过在消息中以小端字节顺序排列而进一步复杂化。

我可以处理H / W结束代码,但我正在努力学习java脚本,并且可以使用函数帮助来翻译HEX ASCII< - >浏览器端的数字。

有什么想法吗?任何示例代码在哪里?

谢谢, 保罗

3 个答案:

答案 0 :(得分:31)

听起来像你想要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]

答案 1 :(得分:7)

您正在寻找parseInt()功能:

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

答案 2 :(得分:3)

你找了这两个函数吗?

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