将十六进制ASCII转换为数字?

18
我有一个硬件设备,通常使用串口进行接口通信,向PC UI程序发送和接收二进制消息。我添加了一个以太网口、小型TCP/IP协议栈和一个小型Web服务器,希望用它来替换串口UI,实现基于Web浏览器的UI。
这些消息大多是请求/响应类型的,但对于某些Web页面,我可能需要发送和接收两个或更多消息才能获得页面所需的所有信息。我将使用AJAX XMLHttpRequest()发送消息并获取页面响应结果。
硬件设备的资源(CPU和RAM)有限,因此为了简化它,我只想制作一个小型CGI接口,将传出的消息编码为十六进制ASCII(即每字节两个十六进制ASCII字符),然后发送到浏览器。浏览器将使用一些JavaScript将消息解析成字段,并将其转换为数字变量并显示给用户。从浏览器发送到硬件设备的消息也是如此。
消息包含混合字段类型,有符号和无符号字节、短整型、长整型、浮点型,并且由于是小端字节顺序,消息更加复杂。
我可以处理硬件端代码,但我正在努力学习JavaScript,并需要帮助编写一个函数,在浏览器端将十六进制ASCII与数值进行转换。
有什么想法吗?哪里可以找到示例代码?
谢谢, 保罗

https://dev59.com/HnVD5IYBdhLWcg3wL4mM - J.J.
3个回答

44
听起来你需要使用 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]

所以使用JavaScript,我会将ASCII HEX字符串解析为char数组,将每两个字符转换为两个字符的字符串,然后使用parseInt()将其转换为字节并将其放入字节数组中,从而得到一个大小为ASCII HEX字符串一半的字节数组?然后从字节数组中挑选出每个字段的字节,并处理字节顺序交换(是否有函数可用于此?)?对于反向传输的消息,有什么JavaScript函数可以将一个字节转换为两个ASCII HEX字符?顺便说一句,非常感谢 保罗 - Paul
那应该能帮助我入门。非常感谢。现在我只需要在它周围添加一些数组处理即可。再次感谢, 保罗 - Paul

9
您正在寻找parseInt()函数:
x = "0xff";
y = parseInt(x, 16);
alert(y);   //255

这不适用于\x转义的数字。 - undefined

2

你是不是在寻找类似以下2个函数的内容?

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

是的,就是这样。基本思路是将类似于C结构体的内容: <code> struct message_1 { double value_1; unsigned long value_2; signed short value_3; char[6] string_1; } </code>转换为HEX ASCII字符串并发送到浏览器,再根据消息类型将其转换回各个值,并为用户显示部分或全部数据。谢谢, Paul - Paul

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接