节点中的十六进制到AScii转换是否出错?

时间:2018-03-27 21:34:18

标签: javascript node.js hex buffer ascii

好的,首先感谢您的时间。这让我很疯狂。

因此经过大量的挖掘后,我现在正在通过RS232正确地“说话”,这意味着使用HEX与它交谈。

所以我已经能够将数据发送到规模并根据需要将其恢复。我在node.js上处理它时得到的结果却令我疯狂。

连接后经过的原始数据是

<Buffer 06 02 30 32 1b 33 1b 31 31 34 34 35 1b 30 30 30 31 32 30 1b 30 30 31 33 37 33 03>

我正确地将其转换为字符串:

var coiso = Buffer.from(Buffer.concat(porquinho), 'ascii').toString('hex');

得到结果:

060230321b331b31313434351b3030303132301b30303133373303

如果我在任何在线HEX到ASCII网站上获得此值(例如this),我得到的结果应该是正确的:

02311445000120001373

但是,如果我在节点中使用任何javascript函数进行转换,包括网站使用的那个:

function OnConvert(doom)
    {
        hex = doom;
        hex = hex.match(/[0-9A-Fa-f]{2}/g);
        len = hex.length;
        if( len==0 ) return;
        txt='';
        for(i=0; i<len; i++)
        {
            h = hex[i];
            code = parseInt(h,16);
            t = String.fromCharCode(code);
            txt += t;
        }
        return txt;
    }

我毫无例外地得到的结果是:

0214450012001373

这是完全不同的,因为我在比例中丢失了一位数的重量以及计算出的价格中的一位数!

我在这里做错了什么?

请帮帮我......这让我疯了!

提前谢谢你,

亲切的问候:

JoãoMoreira

更新正如ChrisG的评论所指出的,如果您在浏览器中使用完全相同的功能,结果是正确的(检查它 - &gt; codepen)!这是一些node.js怪癖????我正在使用节点v8.9.3。

1 个答案:

答案 0 :(得分:0)

所以经过大量的测试和挖掘后,我注意到节点中的结果在windows命令行中是不同的(我在Mac上)。

因此,在我测试了字符串的长度而不是其内容后,我发现它在各处完全相同,这基本上意味着这是一个问题,字符串的内容被命令行视为其他东西。 ..非常感谢Apple!

因此,如果您使用SERIAL PORTS和包含HEX或ASCII的通信协议,如果您不使用命令行,那么它可能是最好的。

只是一个小建议的人!!!