为什么从java切换到javascript时字节数组更新

我正在使用一个将二进制数据发送到Ponte(Node.js)应用程序的工具,该应用程序将此消息(未经更改)转发给AMQP代理。

总的来说它是:Java – > JavaScript – > Java我有一个奇怪的二进制数据转换。 以下是HEX值的顺序:

当我准备一个二进制数据集时,它看起来像这样:

[4, -30, -30, -9, -115, 0, 1, 0, 1, 0, 96, -32, 46, 0, 0, 0] 

当它到达JavaScript(庞特)它看起来像这样:

 [4, 226, 226, 247, 141, 0, 1, 0, 1, 0, 96, 224, 46, 0, 0, 0] 

在这里,负小数变成正数小数。 如果你“减去”这些值,那么你可以看到它们的值是256

现在我通过AMQP代理将这些数据从JavaScript发回到Java。

在Java中,我的二进制数据现在看起来像这样:

 [4, -17, -65, -67, -17, -65, -67, -17, -65, -67, -17, -65, -67, 0, 1, 0, 1, 0, 96, -17, -65, -67, 46, 0, 0, 0] 

它跟以前一样,但是现在所有的小数由负转正

 -17, -65, -67, 

在Java中,我正在处理字节数组,在JavaScript中,我正在使用一个缓冲区。 任何人都可以解释这个奇怪的行为来自哪里?

让我知道如果你需要更多关于我的问题的信息。

万分感谢!

这显然是Ponte和java之间签名/未签名的问题

[4,-30,-30,-9,-115,0,1,0,1,0,96,-32,46,0,0,0]

[4,226,226,247,141,0,1,0,1,0,96,224,46,0,0,0]

如果你仔细观察,负值就会通过加上256的值来补充它的补充。

在Ponte方面,你可以做math转换这个数组到一个有符号的8位数字

[4,226,226,247,141,0,1,0,1,0,96,224,46,0,0,0]

只需检查在java方面所有大于127的数字都是负数,所以你需要这样做:

如果number> 127,那么number – = 256

这一切都与你(我的意思是编程语言)解释8位。 在Java中,第一位是符号位,而在JavaScript中,第一位被视为数字的最大位。 数据方面,这两个值是等价的。 如果你想防止这种切换,你应该使用像charint这样的较大的原始值