2012-12-18 197 views
2

十六进制字符串:的Javascript十六进制字符串fromCharCode

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的报价,因为在‘忙碌’的一天,我有一些丢失的数据。 拿到剧本的使用python binascii工作。(联合国)hexlify和PHP MBSTRING(UN)包(Web视图)。

期待:

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

1)试着输入'在节点解释0x6a'看看会发生什么,注意它'“的0x6A”'有什么区别。 2)'String.fromCharCode'的参数非常奇怪。 3)另外,不要在数组中使用'for in'。 – elmigranto

+0

为什么你需要:“String.fromCharCode” 如果你已经在使用:“.toString(16)” 那么你已经有了一个String。 – Foggzie

+0

这是为了沟通的目的。我需要翻译传入的hexstring消息,创建响应消息,并将响应消息作为十六进制字符串发回。所以我需要String.fromCharCode,并且很迷惑为什么它被称为超级奇怪。 感谢您的提示为{在};) – lontongcorp

回答

4

你的代码似乎是为我工作,如果我再次解码。 虽然使用for()循环遍历Javacript中的对象,但请注意。这也迭代了一个对象的属性。

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的部分向后兼容性,您的一些十六进制值将保持1byte。

+0

OP发布的代码中没有任何对象。你需要小心使用普通的for循环与实际的对象。对于循环来说,对物体来说是完美无缺的。普通的'for'循环对于数组来说是非常好的。但是你的解决方案使用正确的'for'循环来处理这个 – Ian

+0

,所以我怎么能够管理这个向后的可兼容性,因为python和php脚本之间没有问题? – lontongcorp

+0

你是什么意思? – Tyron

1

即使你在你的代码编写0x6A,JavaScript的自动将其理解为它的价值,106就已经是一个数字,所以parseInt()不会做任何事情,它和可以删除。

你可能只是想这样做:

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

有时它读作“的0x6A”(字符串)。我只是想确保它解析为一个十六进制字符串 – lontongcorp