2

十六进制字符串:

var str = [0x6A, 0xE8, 0x05, 0x01, 0x00, 0x01, 0xD9, 0xDC, 0x0A, 0x09];
byte = '';
for (var i=0; i < str.length; i++) {
    byte += String.fromCharCode( parseInt(str[i], 16).toString(16) );
}

但接收器显示:

6A C3A8 05 01 00 01 C399 C39C 0A 09

知道如何保持 2 个字节吗?或者也许我的代码错了,尤其是。对于nodejs?

*更新了脚本。我对 nodejs 有点陌生,我想看看 nodejs 提供什么非阻塞事件,因为在“忙碌”的日子里我有一些丢失的数据。使用 binascii.(un)hexlify 和 PHP mbstring (un)pack(用于 Web 视图)使脚本适用于 python。

期待:

6A E8 05 01 00 01 D9 DC 0A 09
4

2 回答 2

4

如果我再次解码,您的代码似乎对我有用。在 Javacript 中使用 for() 循环对象时要小心。这也迭代了对象的属性。

var str = [0x6A, 0xE8, 0x05, 0x01, 0x00, 0x01, 0xD9, 0xDC, 0x0A, 0x09];
byte = '';
for (var i=0; i < str.length; i++) {
    byte += String.fromCharCode( parseInt(str[i], 16).toString(16) );
}

var hexarrayout = [];
for (var i=0; i<byte.length; i++) {
    hexarrayout.push(byte.charCodeAt(i).toString(16));
}

alert(hexarrayout);

​ http://jsfiddle.net/ycG4n/上的示例

发送到接收器时,您的问题看起来非常像 utf8<=>iso-.../ascii/etc 转换问题,其中一些 1 字节字符串字符被转换为 2 字节字符。由于 UTF-8 的部分向后兼容性,一些十六进制值将保持 1 字节。

于 2012-12-18T22:10:04.637 回答
2

即使您正在编写0x6A代码,JavaScript 也会自动将其理解为它的值 106。它已经是一个数字,因此parseInt()不会对它做任何事情并且可以将其删除。

您可能只想这样做:

var str = [0x6A,0xE8...];
var byte = String.fromCharCode.apply(null,str);
于 2012-12-18T22:08:02.240 回答