5

我有一个变量,我们称之为它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,那么当我在 Wireshark 中检查它时,它看起来str0x00, 0x00, 。0x010x5e

charCodeFrom()仅当每个单独的字节具有值 <= 0x7f 时才执行我想要的操作。有没有一种独立于浏览器的方式来做我想做的事情?

谢谢

4

1 回答 1

3

简而言之:你不能。

更长的时间:发生这种情况是因为字符串中具有值 >= 的任何字符0x80都将使用浏览器的默认编码(可能是 UTF-8,但有时您会发现浏览器选择“随机”)编码为 un​​icode。例如,如果您发送一个带有 value 的“字节” \x80,您可能会\xC2\x80在线上看到 (`"\xC2\x80".decode("utf-8") == u"\u0080")。

您可以将页面编码设置为 8 位编码,例如 CP1252,这可以(在某些浏览器中,当星星正确对齐时)诱使浏览器在对 JavaScript 字符串进行编码时使用相同的编码......但这不会保证跨浏览器兼容。

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

  • 设置端点以将来自 JS 的字符串解码为 un​​icode,然后将它们重新编码为字节(在 Python 中,它类似于"".join(chr(ord(ub)) for ub in your_unicode_string)
  • 将“字节”作为整数数组发送:var bytes = [ (myNum >> 24) & 0xFF, … ];
于 2012-09-07T19:14:29.687 回答