【问题标题】:Convert an integer to a string of bytes将整数转换为字节串
【发布时间】:2012-09-01 16:30:22
【问题描述】:

我有一个变量,我们称它为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 看起来像 0x00,0x00,0x01,0x5e

charCodeFrom() 仅在每个单独的字节具有值

谢谢

【问题讨论】:

    标签: javascript string int


    【解决方案1】:

    简而言之:你不能。

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

    您可以将页面编码设置为 CP1252 之类的 8 位编码,可以(在一些浏览器中,当星星正确对齐时)哄骗浏览器在对 JavaScript 字符串进行编码时使用相同的编码……但这并不能保证跨浏览器兼容。

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

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

    【讨论】:

    • 对问题的出色描述。但是,一旦字符串命中 Javscript,它将是 UTF16,因此还有另一层翻译问题。
    • 谢谢!而且,是的,在内部,“字节”将使用 UTF16 编码……但是,除了字符串占用的内存是您预期的两倍之外,我想不出任何问题会由此引起特别是……有吗?
    • 只是注意到UTF8和UTF16编码不同,所以八位字节序列会不同。我不经常使用 UTF16,但我很确定 x80 将被编码为 \x00\x80 (UTF16) 而不是 x\c2\x80 (UTF8)
    • 在内部,是的,这就是它的编码方式……但是通过网络,浏览器将使用(通常,在大多数情况下)页面的编码(因此可能是 UTF-8)对其进行编码。
    猜你喜欢
    • 1970-01-01
    • 2014-10-31
    • 2013-09-27
    • 1970-01-01
    • 2022-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多