Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/396.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JavaScript-整数的负字节_Javascript_Encoding_Integer_Byte - Fatal编程技术网

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

我通过使用0x80对字节进行ORing,将始终小于127且带有1位标志的字节传输到客户端

在客户端,在JavaScript中,我有一个表示消息字节的数字数组()(是的,它可能是哑的,但我还没有找到类型化数组)

一切正常,直到我找到一个具有最低字节集的最高位的数字

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
。有关更多详细信息,请参见我的答案: