我怎样才能得到我用来制作大字节数组的实际字节数?
How can I get my actual bytes that I used to make a big byte array?
我有一种方法可以按照以下格式制作一个字节数组。
- 首先获取 avroBytes。
- 然后 snappy 压缩它。
- 然后它生成另一个具有特定格式的字节数组,如下所示。
方法如下:
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);
此方法需要 holderMap
和 record
作为参数,查看调用 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 接口,可能有一些方法可以直接从序列化字节中解压缩数据,而无需制作中间副本。
我有一种方法可以按照以下格式制作一个字节数组。
- 首先获取 avroBytes。
- 然后 snappy 压缩它。
- 然后它生成另一个具有特定格式的字节数组,如下所示。
方法如下:
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);
此方法需要 holderMap
和 record
作为参数,查看调用 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 接口,可能有一些方法可以直接从序列化字节中解压缩数据,而无需制作中间副本。