我通过将字节与 0x80 进行“或”运算,将始终小于 127 且带有 1 位标志的字节传输到客户端。
在客户端,在 JavaScript 中,我有一个代表消息字节的数字 Array()(是的,这可能很愚蠢,但我还没有弄清楚类型化数组)。
一切正常,直到我命中最低字节集最高位的数字。
Number: 0011 0101
flag: 1000 0000
---------
1011 0101
Stored as
integer in ???
JavaScript
如何检索原始字节(最高位设置为 0)以及标志(由最高位的值表示)?
示例:
(server)
byte x = 90
x | 0x80
> -38
(client - JavaScript)
var x = -38
x ^ 0x80
> -166
如何拿回 90?
编辑 - 我发现这是由于我的代码中的另一个错误...我并没有对编码感到疯狂...抱歉...
最佳答案
在 JavaScript 中尝试以下操作:
var received = -38;
var adjusted = received & 0xFF; // 218
var original = adjusted ^ 0x80; // 90
这应该可以解决你的问题。
说明: JavaScript 中的所有数字都存储在 double-precision floating point format 中:
但是,位运算符无法处理 float 。因此,它们将操作数转换为 32 位有符号整数。 [source]
-38 = 11111111 11111111 11111111 11011010
因此,如果您执行-38 ^ 0x80
,您会得到错误的答案,因为只有右侧的第 8 位设置为 0
。您需要首先将 -38
限制为 8 位,然后再与 0x80
进行异或。仅需要最低有效字节(即11011010
)。因此,我们执行 -38 & 0xFF
来获取最低有效字节。
现在您已经有了正确的字节,您可以简单地将其与 0x80
进行异或。
TLDR:使用字节和0xFF ^ 0x80
。
关于JavaScript - 整数的负字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19561980/