将整数转换为字节串

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中检查时,str将变成0x000x000x010x5e
只有当每个单独的字节的值<=0x7f时,charCodeFrom()才能按照我的意愿执行。是否有一种与浏览器无关的方法可以实现我想要做的事情?
谢谢。
1个回答

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, … ];

问题描述得非常好。然而,一旦字符串到达JavaScript,它将变成UTF16,因此又会出现另一层翻译问题。 - Jeremy J Starcher
谢谢!是的,内部“字节”将使用UTF16编码...但是,除了字符串占用的内存是您预期的两倍之外,我想不出会因此引起任何问题...有吗? - David Wolever
只是注意到UTF8和UTF16编码是不同的,因此八位字节序列将不同。我不经常使用UTF16,但我相当确定x80将被编码为\x00\x80(UTF16),而不是x\c2\x80(UTF8)。 - Jeremy J Starcher
内部来说,是的,它将被编码...但是在传输过程中,浏览器将使用页面的编码(通常情况下为UTF-8)对其进行编码。 - David Wolever

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