Java readInt 方法 returns Scala 中 Int 的 LittleEndian 值而不是 BigEndian 值
Java readInt method returns LittleEndian rather than BigEndian value of Int in Scala
我正在使用 Kryo 反序列化最初在 Spark 中序列化的 class。 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;
}
这个returns值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
以错误的方式将 bytes 转换为 int。如果您仔细检查 readInt() 方法,您会发现您已经切换了顺序。
val x = (a & 0xFF) | (b & 0xFF) << 8 | (c & 0xFF) << 16 | d & 0xFF << 24;
这才是正确的写法。
我正在使用 Kryo 反序列化最初在 Spark 中序列化的 class。 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;
}
这个returns值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
以错误的方式将 bytes 转换为 int。如果您仔细检查 readInt() 方法,您会发现您已经切换了顺序。
val x = (a & 0xFF) | (b & 0xFF) << 8 | (c & 0xFF) << 16 | d & 0xFF << 24;
这才是正确的写法。