gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 08:37:51 26 4
gpt4 key购买 nike

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

总体来说是:Java -> JavaScript -> Java而且我确实对二进制数据进行了奇怪的转换。以下是按出现顺序排列的十六进制值:

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

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

当它到达 JavaScript (Ponte) 时,它看起来像这样:

[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 方面,您可以通过数学运算将此数组转换回带符号的 8 位数字

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

只要检查所有大于 127 的数字在 Java 端都是负数,所以你需要做:

如果数字 > 127 那么数字 -=256

关于javascript - 为什么从 java 切换到 javascript 时字节数组会更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42512927/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com