gpt4 book ai didi

Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值

转载 作者:行者123 更新时间:2023-11-30 01:55:22 24 4
gpt4 key购买 nike

我正在使用 Kryo 反序列化最初在 Spark 中序列化的类。 Kryo 以 BigEndian 格式编写其所有原语,但是当我尝试在另一台计算机上反序列化这些值时,该值将像 LittleEndian 一样返回。

Kryo 中的底层方法:

public int readInt () throws KryoException {
require(4); // Does a basic positionality check that passes in this case
byte[] buffer = this.buffer;
int p = this.position;
this.position = p + 4;
return buffer[p] & 0xFF //
| (buffer[p + 1] & 0xFF) << 8 //
| (buffer[p + 2] & 0xFF) << 16 //
| (buffer[p + 3] & 0xFF) << 24;
}

这将返回值 0x70000000。但是当我的程序(在 Scala 中)使用 Kryo 的 readByte 方法时:

public byte readByte () throws KryoException {
if (position == limit) require(1);
return buffer[position++];
}

并单独读取字节,如下所示:

  val a = input.readByte()
val b = input.readByte()
val c = input.readByte()
val d = input.readByte()
val x = (a & 0xFF) << 24 | (b & 0xFF) << 16 | (c & 0xFF) << 8 | d & 0xFF

然后我得到 x 的 0x70。我不明白这里发生了什么事。这是 Scala 和 Java 之间的某种转换问题,还是与 Kryo 和底层字节数组有关?

最佳答案

您编写的代码:

  val a = input.readByte()
val b = input.readByte()
val c = input.readByte()
val d = input.readByte()
val x = (a & 0xFF) << 24 | (b & 0xFF) << 16 | (c & 0xFF) << 8 | d & 0xFF

以错误的方式将字节转换为 int。如果您仔细检查 readInt() 方法,您会发现您已经切换了顺序。

  val x = (a & 0xFF) | (b & 0xFF) << 8 | (c & 0xFF) << 16 | d & 0xFF << 24;

这是正确的写法。

关于Java readInt 方法返回 Scala 中 Int 的 LittleEndian 而不是 BigEndian 值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54715254/

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