代码之家  ›  专栏  ›  技术社区  ›  kellanburket

kryo readint方法返回littleendian而不是int的bigendian值

  •  0
  • kellanburket  · 技术社区  · 6 年前

    我正在使用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;
    }
    

    这将返回值0x7000000。但是当我的程序(在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。我不明白这里发生了什么。是斯卡拉和Java之间的某种转换问题,还是与KyRo和下位字节数组有关?

    0 回复  |  直到 6 年前
        1
  •  2
  •   jontro    6 年前

    你写的代码:

      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;
    

    这是正确的写法。