JavaScript十六进制字符串 fromCharCode

3

十六进制字符串:

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处理python脚本并使用PHP mbstring (un)pack(用于Web视图)使脚本正常工作。

期望:

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

为什么需要使用 "String.fromCharCode"? 如果您已经在使用 ".toString(16)",那么您已经有了一个字符串。 - Foggzie
  1. 在Node解释器中尝试输入0x6a,并观察其与"0x6a"的不同之处。
  2. String.fromCharCode的参数非常奇怪。
  3. 此外,不要在数组中使用for in
- Aleksei Zabrodskii
这是为了通信目的。我需要翻译十六进制字符串传入的消息,创建响应消息,并将响应消息作为十六进制字符串发送回去。因此,我需要使用String.fromCharCode,但不太明白为什么它被称为超级奇怪。感谢关于{for in}的提示;) - lontongcorp
2个回答

5

如果我再次解码,您的代码似乎可以正常工作。但是,在Javascript中小心使用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 等转换问题,其中一些 1 字节字符串字符被转换为 2 字节字符。由于 UTF-8 的部分向后兼容性,您的某些十六进制值将保持为 1 字节。


代码中没有对象。使用实际对象时,需要小心使用普通的 for 循环。for in 循环对于对象来说是完全可以的。普通的 for 循环对于数组来说是完全可以的。但是你的解决方案使用了正确的 for 循环。 - Ian
那么我应该如何管理这种向后兼容性,因为Python和PHP脚本之间没有任何问题呢? - lontongcorp

2
尽管您在代码中写的是0x6A,但JavaScript会自动将其理解为其值106。它已经是一个数值,所以parseInt()对它没有任何作用,可以被删除。
您可能只想这样做:
var str = [0x6A,0xE8...];
var byte = String.fromCharCode.apply(null,str);

有时它会被读作"0x6A"(字符串)。我只想确保它被解析为十六进制字符串。 - lontongcorp

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