1

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

编辑 - 我发现这是由于我的代码中的另一个错误......我并没有对编码发疯......对不起......

4

3 回答 3

1

在 JavaScript 中尝试以下操作:

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

那应该可以解决您的问题。

解释: JavaScript 中的所有数字都以双精度浮点格式存储

然而,位运算符不能处理浮点数。因此,它们将操作数转换为 32 位有符号整数。[资源]

-38 = 11111111 11111111 11111111 11011010

因此,如果您这样做,-38 ^ 0x80您会得到错误的答案,因为只有右边的第 8 位设置为0. 您需要先限制-38为 8 位,然后再使用0x80. 只需要最低有效字节(即11011010)。因此,我们这样做是-38 & 0xFF为了获得最低有效字节。

现在您有了正确的字节,您可以简单地将它与0x80.

TLDR:使用byte & 0xFF ^ 0x80

于 2013-10-24T09:56:55.917 回答
0

不确定我是否理解这个问题,但我会试一试:您只需对 0x80 进行异或运算:

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

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

如果您有不同的结果,那么您的代码中可能有一些不同的地方——如果您运行上面的代码,应该会给出预期的结果。

于 2013-10-24T09:36:52.920 回答
0

我没有看到问题。

这是我为测试而编写的一些代码,带有JSFiddle 现场演示

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 的价值。这是一个更新的 JSFiddle

于 2013-10-24T09:41:57.983 回答