2012-09-07 211 views
4

我有一个变量,我们称之为myNum,它包含一个32位值。我想把它变成一个4字节的字符串,其中字符串的每个字节对应于myNum的一部分。将整数转换为字符串

我试图做类似如下(不工作):

var myNum = someFunctionReturningAnInteger(); 
var str = ""; 

str += String.charCodeFrom((myNum >>> 24) & 0xff); 
str += String.charCodeFrom((myNum >>> 16) & 0xff); 
str += String.charCodeFrom((myNum >>> 8) & 0xff); 
str += String.charCodeFrom(myNum & 0xff); 

例如,如果myNum等于350则str会是什么样0x000x000x010x5e当我用wireshark检查它时。

charCodeFrom()只有当我想要每个单独的字节的值< = 0x7f。有没有独立于浏览器的方式来做我想做的事情?

谢谢

回答

3

总之:你不能。

更长:发生这种情况的原因是字符串中值大于等于0x80的任何字符将使用浏览器的默认编码(可能是UTF-8编码为unicode),但偶尔会发现一个浏览器会选择一些内容“随机”)。例如,如果您发送的值为“\x80”的“字节”,您可能会在电汇上看到\xC2\x80(`“\ xC2 \ x80”.decode(“utf-8”)== u“\ u0080”)。

您可以到页面编码设置为8位编码像CP1252,这可能(在一些浏览器,当星星正确对齐)哄浏览器到使用相同的编码时它编码JavaScript字符串...但这不能保证跨浏览器兼容。

一些更可靠的选择可能是:

  • 设置终点从JS来的字符串解码为Unicode,然后再对其进行编码为字节(在Python中,它会像"".join(chr(ord(ub)) for ub in your_unicode_string)
  • 发送“字节”作为一个整数数组:var bytes = [ (myNum >> 24) & 0xFF, … ];
+0

问题的精彩描述。但是,一旦字符串命中Javscript,它将是UTF16,所以还有另一层翻译问题。 –

+0

谢谢!而且,是的,内部的“字节”将使用UTF16编码......但是,除了字符串将占用您预期的两倍的内存这一事实之外,我想不出任何会由此导致的问题特别是......有没有? –

+0

只是注意到UTF8和UTF16编码是不同的,所以八位字节序列将会不同。我经常不使用UTF16,但我确信'x80'会被编码为'\ x00 \ x80'(UTF16)而不是'x \ c2 \ x80'(UTF8) –