JavaScript - 整数的负字节

标签 javascript encoding integer byte

我通过将字节与 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/

相关文章:

javascript - 如何将 IST 时区对象添加到 Moment.js

javascript - 如何在 JavaScript 中将模式与数组进行匹配?

javascript - 停止 JavaScript 执行,直到 Promise 得到解决

ruby - 在 ruby​​ 中从 iso-2022-jp 转换为 UTF

python - unicode字节序让我困惑

c - 存储由零和一组成的大整数

javascript - 当 2 个选择具有特定值时显示 div

java - Docx4j - 更改 docDefaultStyle 的语言设置/将自定义(或更改的)库存样式正确应用到 docx 中的任何文本

c - ANSI C,没有可变参数函数的整数到字符串

c++ - C++ 整数除法如何用于限制和负值?