为什么从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中,第一位被视为数字的最大位。 数据方面,这两个值是等价的。 如果你想防止这种切换,你应该使用像char
或int
这样的较大的原始值