2017-02-28 72 views
1

我正在使用一种工具将二进制数据发送到Ponte(Node.js)应用程序,该应用程序将此消息(未经更改)转发给AMQP代理。为什么从java切换到javascript时更新字节数组

总的来说它是:Java - > JavaScript - > Java 而且我确实有一个奇怪的二进制数据转换。以下是他们的顺序出现的十六进制值:

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

[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中使用Buffer。任何人都可以解释这种奇怪的行为来自哪里?

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

非常感谢!

+2

Java具有**签名**字节;但为了真正理解正在发生的事情;您可能需要更普遍地提供[mcve] – GhostCat

+0

@GhostCat,有符号数(=原语) – ControlAltDel

回答

3

这显然是蓬和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来转换其补偿公式...

上的老侧可以执行数学到这个数组变换回一个符号的8个比特数

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

只是检查所有数字biggges超过127人在Java方面不利,所以你需要做的:

如果数量> 127则数 - = 256

+0

谢谢!我能在Ponte内处理这个问题吗?我无法更改来自第一个Java应用程序的数据。 –

+0

HI @MK,当然,将值转换回....如果数字ig大于127,那么它是负数,所以你需要休息256 :) –

+0

但是,我不会有同样的问题呢?这意味着我再次在JavaScript中有一个签名数组。还是仅仅是在开始时的转换?这会影响任何字符串?目前我正在发送半字符串,半个二进制数据 –

1

这一切都与你(我的意思是亲编纂语言)解释8位。在Java中,第一位是符号位,而在JavaScript中,第一位被视为数字的最大位。从数据来看,这两个值是等价的。如果要防止此切换,则应使用较大的原始值,如charint

+0

谢谢你的回复!我已经想到了类似的东西。 问题是,我无法更改来自Java的数据,因为现在我只是模拟这个二进制数据。后来它会来自我无法控制的外部来源。 但是,我确实可以控制JavaScript部分,并且在Java部分发送第二条消息(但数据已经以错误格式到达)。 我能在JavaScript部分中处理它吗? 再次感谢! –

相关问题