gpt4 book ai didi

Java - CRC32.update() 在连接的 ByteBuffer 上

转载 作者:行者123 更新时间:2023-11-29 04:22:28 25 4
gpt4 key购买 nike

我有以下功能:

   byte[] test1 = {1,2,3,4};
byte[] test2 = {5,6,7,8};
ByteBuffer bbtest1 = ByteBuffer.wrap(test1).order(ByteOrder.LITTLE_ENDIAN);
ByteBuffer bbtest2= ByteBuffer.wrap(test2).order(ByteOrder.LITTLE_ENDIAN);

ByteBuffer contents = ByteBuffer.allocate(bbtest1.limit() + bbtest2.limit());
contents.put(bbtest1);
contents.put(bbtest2);

CRC32 checksum = new CRC32();
checksum.update(contents);

System.out.println(checksum.getValue());

无论我为我的字节数组分配什么值,getValue() 在我通过 byteBuffers 连接时总是返回 0。根据this thread ,这是连接字节缓冲区的有效方式。如果我只在单个 byteBuffer 上调用 put() (例如,如果我注释掉行 byte[] test2 = {5,6,7,8}; 那么 getValue() 实际上返回一个有效的值(value)。

这是连接 ByteBuffer 的方式的问题,update(ByteBuffer) 在连接的 ByteBuffers 上执行,还是其他什么?

最佳答案

您对 put 的调用已将 ByteBuffer 的位置提升到没有剩余字节可用于 CRC32.update() 读取的程度。

如果您只放置两个字节缓冲区之一,那么仍有 4 个字节要读取用于 CRC 校验和(所有 4 个字节的值为 0)。

在调用 checksum.update(contents) 之前,您需要将字节缓冲区的位置重置为零。您可以为此使用 rewindflip:

contents.rewind();

contents.flip();

Flip 与 rewind() 的作用相同,但另外它将 ByteBuffer 的 limit 设置为翻转前的 position,因此,如果您首先构建了 ByteBuffer 的内容,然后想从中读取,flip() 更正确,因为您不会冒从您没有读取的 ByteBuffer 部分读取的风险' 尚未写入。

EJP 的回答很有见地,因为他指出您根本不需要连接字节缓冲区。

您也可以执行以下操作之一:

  • 用单独的 ByteBuffers 更新 CRC32
  • 使用ByteBuffer.put(byte[])直接将test1test2字节数组放入contents 字节缓冲区
  • 完全跳过 ByteBuffers 并依次调用 CRC32.update(byte[])test1test2

关于Java - CRC32.update() 在连接的 ByteBuffer 上,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48257336/

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