我怎样才能得到我用来制作大字节数组的实际字节数?

How can I get my actual bytes that I used to make a big byte array?

我有一种方法可以按照以下格式制作一个字节数组。

方法如下:

  public static byte[] serialize(final Record record, final int clientId,
      final Map<String, String> holderMap) throws IOException {
    byte[] avroBytes = getAvroBytes(holderMap, record);
    byte[] snappyCompressed = Snappy.compress(avroBytes);

    int size = (2+8+4) + snappyCompressed.length;

    ByteBuffer buffer = ByteBuffer.allocate(size);
    buffer.order(ByteOrder.BIG_ENDIAN);
    buffer.putShort((short) clientId);
    buffer.putLong(System.currentTimeMillis());
    buffer.putInt(snappyCompressed.length);
    buffer.put(snappyCompressed);
    buffer.rewind();

    byte[] bytesToStore = new byte[size];
    buffer.get(bytesToStore);

    return bytesToStore;
  }

现在我想在 bytesToStore

之后得到我的实际 avroBytes
byte[] bytesToStore = serialize(......);
// now how can I get actual `avroBytes` using bytesToStore?

有什么办法可以取回吗?

从代码来看,好像已经有一个方法returns avroBytes,例如:

byte[] avroBytes = getAvroBytes(holderMap, record);

此方法需要 holderMaprecord 作为参数,查看调用 serialize 的代码,您已经有了这两个值。因此,如果可能,您可以在调用 serialize 之前调用 getAvroBytes 并将其作为参数传递给 serialize 方法。

根据代码,压缩版本从 bytesToStore[14] 开始,因此一种简单但不一定最有效的方法是从该位置复制字节,然后调用 Snappy.uncompress(bytes).

像这样:

public static int HEADER_SIZE = 2 + 8 + 4;

public static byte[] extractAvroBytes(byte[] bytesToStore) throws IOException {
    byte[] bytes = Arrays.copyOfRange(bytesToStore, HEADER_SIZE, bytesToStore.length);
    return Snappy.uncompress(bytes);
}

我还没有对此进行测试,因此可能需要进行一些调整。

根据您使用的 Java snappy 接口,可能有一些方法可以直接从序列化字节中解压缩数据,而无需制作中间副本。