我在javascript中创建了一些函数来处理将值转换为字节数组的操作,这些值将被发送到一个Java Web服务器,在那里它们将被读取。
在js中编写int时,我使用了:
function writeInt(num) {
let arr = new Uint32Array([
(num & 0xff000000) >> 24,
(num & 0x00ff0000) >> 16,
(num & 0x0000ff00) >> 8,
(num & 0x000000ff)
]);
buf.push(Buffer.from(arr));
}
整数是以小端字节序接收的,虽然我并不完全理解按位运算,但我从stack和google那里得到了一些帮助。我用Java读取整数,如下所示(bs是我的流变量):(bs.readByte() << 24) + (bs.readByte() << 16) + (bs.readByte() << 8) + (bs.readByte());
但是,当我尝试编写一个双精度浮点数时,我使用了writeDoubleLE(number)函数,如下所示:
const double = Buffer.allocUnsafe(8);
double.writeDoubleLE(num);
buffer.push(Buffer.from(double));
我在Java中使用了这个函数:
return Double.longBitsToDouble(
((byte) (bs.readByte() & 0xFFL)) << 56 |
((byte) (bs.readByte() & 0xFFL)) << 48 |
((byte) (bs.readByte() & 0xFFL)) << 40 |
((byte) (bs.readByte() & 0xFFL)) << 32 |
((byte) (bs.readByte() & 0xFFL)) << 24 |
((byte) (bs.readByte() & 0xFFL)) << 16 |
((byte) (bs.readByte() & 0xFFL)) << 8 |
((byte) (bs.readByte() & 0xFFL)));
我尝试了一些随机数,如22.5,现在,值显然是错误的,给我的东西,如2.0789966E-317和5.32223134E-315。
我一直在用Java编写代码,因为发送的字节看起来是正确的,但它就是不起作用。
最后,我尝试了writeDoubleBE,Java代码可以成功地读取它。这感觉不对,因为double的字节现在显然与数组中其他字节的格式不一致。我更愿意了解发生了什么以及为什么这不起作用。看起来我的javascript代码写错了,但我不确定是JS还是Java。
我希望有更多关于这方面的知识的人能给我解释一下,并指出我在写/阅读价值观时做错了什么。
1条答案
按热度按时间8fq7wneg1#
我想通了,虽然我仍然不确定为什么它会这样工作(第一个字节是〈〈0而不是〈〈56)