JavaScript-整数的负字节
我通过使用0x80对字节进行ORing,将始终小于127且带有1位标志的字节传输到客户端 在客户端,在JavaScript中,我有一个表示消息字节的数字数组()(是的,它可能是哑的,但我还没有找到类型化数组) 一切正常,直到我找到一个具有最低字节集的最高位的数字JavaScript-整数的负字节,javascript,encoding,integer,byte,Javascript,Encoding,Integer,Byte,我通过使用0x80对字节进行ORing,将始终小于127且带有1位标志的字节传输到客户端 在客户端,在JavaScript中,我有一个表示消息字节的数字数组()(是的,它可能是哑的,但我还没有找到类型化数组) 一切正常,直到我找到一个具有最低字节集的最高位的数字 Number: 0011 0101 flag: 1000 0000 --------- 1011 0101 Stored as integer in ??? JavaS
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
编辑-我发现这是由于我的代码中的另一个错误。。。我没有对编码发疯。。。很抱歉…我不确定我是否理解这个问题,但我将试一试:您只需对0x80进行XOR运算:
var received = 181; // 10110101
var num = received ^ 0x80;
console.log(num); // 53, 00110101
如果您有不同的结果,那么您的代码中可能有不同的内容–如果您运行上面的代码,应该会给出预期的结果 我不确定我是否理解这个问题,但我将试一试:您只需对0x80进行XOR运算:
var received = 181; // 10110101
var num = received ^ 0x80;
console.log(num); // 53, 00110101
如果您有不同的结果,那么您的代码中可能有不同的内容–如果您运行上面的代码,应该会给出预期的结果 我看不出有什么问题 下面是我编写的一些代码,用于测试 它给出了期望的结果
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%的价值。这是一个我看不出有什么问题 下面是我编写的一些代码,用于测试 它给出了期望的结果
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%的价值。下面是一个在JavaScript中尝试以下操作:
var received = -38;
var adjusted = received & 0xFF; // 218
var original = adjusted ^ 0x80; // 90
那应该能解决你的问题
说明:存储在以下位置的JavaScript中的所有数字:
然而,位运算符不能处理浮点数。因此,它们将操作数转换为32位有符号整数
因此,如果执行-38^0x80
操作,则会得到错误的答案,因为只有右侧的第8位设置为0
。您需要先将-38
限制为8位,然后再使用0x80
进行异或运算。只需要最低有效字节(即11011010
)。因此,我们使用-38&0xFF
来获取最低有效字节
现在您已经有了正确的字节,只需使用0x80
对其进行异或即可
TLDR:使用
byte&0xFF^0x80
在JavaScript中尝试以下操作:
var received = -38;
var adjusted = received & 0xFF; // 218
var original = adjusted ^ 0x80; // 90
那应该能解决你的问题
说明:存储在以下位置的JavaScript中的所有数字:
然而,位运算符不能处理浮点数。因此,它们将操作数转换为32位有符号整数
因此,如果执行-38^0x80
操作,则会得到错误的答案,因为只有右侧的第8位设置为0
。您需要先将-38
限制为8位,然后再使用0x80
进行异或运算。只需要最低有效字节(即11011010
)。因此,我们使用-38&0xFF
来获取最低有效字节
现在您已经有了正确的字节,只需使用0x80
对其进行异或即可
TLDR:使用
byte&0xFF^0x80
对不起,我没有完全理解这个问题。我认为你只是想把一个字节“拆分”成一个7位值和一个1位值,对吗?是的,但它不再是一个字节了,它是某种JavaScript数字。使用0x80进行XORing仍然会产生负数。能否显示生成负数的代码?这对我很有用:num=parseInt('10110101',2)^0x80
和flag=parseInt('10110101',2)&0x80!==0
我添加了一个示例来解释这个问题。谢谢大家…试试-38&0xFF^0x80
。更多细节请参见我的答案:对不起,我不完全理解这个问题。我认为你只是想把一个字节“拆分”成一个7位值和一个1位值,对吗?是的,但它不再是一个字节了,它是某种JavaScript数字。使用0x80进行XORing仍然会产生负数。能否显示生成负数的代码?这对我很有用:num=parseInt('10110101',2)^0x80
和flag=parseInt('10110101',2)&0x80!==0
我添加了一个示例来解释这个问题。谢谢大家…试试-38&0xFF^0x80
。有关更多详细信息,请参见我的答案: