【问题标题】:Javascript hex string fromCharCodeJavascript 十六进制字符串 fromCharCode
【发布时间】:2012-12-06 04:34:56
【问题描述】:

十六进制字符串:

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

【问题讨论】:

  • 你为什么需要:"String.fromCharCode" 如果你已经在使用:".toString(16)" 那么你已经有了一个字符串。
  • 1) 尝试在节点解释器中输入0x6a 看看会发生什么,注意它与"0x6a" 有何不同。 2)String.fromCharCode 的参数非常奇怪。 3) 另外,不要将for in 与数组一起使用。
  • 这是为了交流。我需要翻译十六进制字符串传入消息,创建响应消息,将响应消息也作为十六进制字符串发送回来。所以我需要 String.fromCharCode 并且很困惑为什么它被称为超级奇怪。感谢 {for in} 的提示;)

标签: javascript node.js hex


【解决方案1】:

如果我再次解码,您的代码似乎对我有用。 在 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/上的示例

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

【讨论】:

  • OP 发布的代码中没有对象。并且您需要小心使用带有实际对象的普通 for 循环。 for in 循环非常适合对象。普通的for 循环非常适合数组。但是您的解决方案为此使用了正确的 for 循环
  • 那么我如何管理这种向后兼容性,因为 python 和 php 脚本之间没有问题?
【解决方案2】:

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

您可能只想这样做:

var str = [0x6A,0xE8...];
var byte = String.fromCharCode.apply(null,str);

【讨论】:

  • 有时读作“0x6A”(字符串)。我只是想确保它被解析为一个十六进制字符串
猜你喜欢
  • 2014-03-07
  • 2011-11-02
  • 2010-10-04
  • 1970-01-01
  • 2019-07-27
  • 2011-03-01
  • 1970-01-01
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多