JavaScript - 整数的负字节

时间:2013-10-24 09:25:53

标签: 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?

编辑 - 我发现这是由于我的代码中的另一个错误...我对编码感到不满意......对不起所有......

3 个答案:

答案 0 :(得分:0)

我不确定我是否明白这个问题,但我会试一试:你只需要对0x80进行异或:

var received = 181; // 10110101
var num = received ^ 0x80;

console.log(num); // 53, 00110101

如果你有不同的结果,你的代码中可能会有不同的东西 - 如果你运行上面的代码,应该给出预期的结果。

答案 1 :(得分:0)

我没有看到问题。

以下是我用JSFiddle live demo

编写的一些代码
var val = 57;
var flag = 1;

var valWithFlag = val | (flag ? 0x80 : 0);
var newVal = (valWithFlag & 0x7F);
var newValFlag = (valWithFlag & 0x80 ? 1 : 0);

alert("Val: " + val.toString() + "\n" + 
      "Flag: " + flag.toString() + "\n" +
      "Val With Flag: " + valWithFlag.toString() + "\n" + 
      "New Val Without Flag: " + newVal.toString() + "\n" + 
      "New Val Flag: " + newValFlag.toString() + "\n");

它给出了预期的结果......

Val: 57
Flag: 1
Val With Flag: 185
New Val Without Flag: 57
New Val Flag: 1

更新基于OP提供的额外详情

我认为这可能是由于javascript中的整数被保存为32位或64位值...所以当你将-38传递给javascript时,它的保存方式与你的单个字节不同。服务器

您需要将-38转换为8字节...

var val = -38;
var jsVal = (val & 0xFF);

哪个应该给你90分的价值。这是updated JSFiddle

答案 2 :(得分:0)

在JavaScript中尝试以下操作:

var received = -38;
var adjusted = received & 0xFF; // 218
var original = adjusted ^ 0x80; // 90

这应该可以解决你的问题。

说明:JavaScript中的所有数字都存储在double-precision floating point format

然而,按位运算符无法处理浮点数。因此,他们将操作数转换为32位有符号整数。 [source]

-38 = 11111111 11111111 11111111 11011010

因此,如果您执行-38 ^ 0x80,则会得到错误的答案,因为只有右边的第8位设置为0。您需要先将-38限制为8位,然后再使用0x80进行测量。只需要最低有效字节(即11011010)。因此,我们-38 & 0xFF得到最不重要的字节。

现在你有了正确的字节,你可以简单地用0x80 xor。

TLDR :使用byte & 0xFF ^ 0x80