通过将字节与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?
编辑 - 我发现这是由于我的代码中的另一个错误...我对编码感到不满意......对不起所有......
答案 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
。