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

连接的ByteBuffer上的Java-CRC32.update(),java,byte,bytebuffer,crc32,Java,Byte,Bytebuffer,Crc32,我有以下功能: 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 = B

我有以下功能:

   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());
无论我为字节数组分配了什么值,当我用byteBuffers连接时,getValue总是返回0。根据,这是连接byteBuffers的有效方法。如果我只调用一个byteBuffer上的put,例如,如果我注释掉行byte[]test2={5,6,7,8};然后getValue实际返回一个有效值

这是ByteBuffer连接方式的问题吗?updateByteBuffer对连接的ByteBuffer执行操作,或者可能是其他问题吗?

您对put的调用将ByteBuffer的位置提升到了一个点,即CRC32.update无法读取字节

如果您只放置两个字节缓冲区中的一个,则CRC校验和仍有4个字节需要读取,所有4个字节的值均为0

在调用checksum.updatecontents之前,需要将bytebuffer的位置重置为零。您可以使用倒带或翻转:

contents.rewind();

Flip与rewind的功能相同,但它还将ByteBuffer的限制设置为它在翻转之前的位置,因此,如果您首先构建ByteBuffer的内容,然后想从中读取,Flip更为正确,因为您不会冒着读取ByteBuffer中尚未写入的部分的风险

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

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

使用单个ByteBuffers更新CRC32 使用ByteBuffer.putbyte[]将test1和test2字节数组直接放入ByteBuffer的内容中 完全跳过ByteBuffers,并依次调用带有test1和test2的CRC32.updatebyte[]。 您对put的调用已将ByteBuffer的位置提升到一个点,即对于CRC32.update,没有剩余的字节可从中读取

如果您只放置两个字节缓冲区中的一个,则CRC校验和仍有4个字节需要读取,所有4个字节的值均为0

在调用checksum.updatecontents之前,需要将bytebuffer的位置重置为零。您可以使用倒带或翻转:

contents.rewind();

Flip与rewind的功能相同,但它还将ByteBuffer的限制设置为它在翻转之前的位置,因此,如果您首先构建ByteBuffer的内容,然后想从中读取,Flip更为正确,因为您不会冒着读取ByteBuffer中尚未写入的部分的风险

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

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

使用单个ByteBuffers更新CRC32 使用ByteBuffer.putbyte[]将test1和test2字节数组直接放入ByteBuffer的内容中 完全跳过ByteBuffers,并依次调用带有test1和test2的CRC32.updatebyte[]。
您需要在通道的put或reads之后调用flip来准备用于获取或写入通道的缓冲区,然后将其压缩

但我根本不知道你为什么要连接ByteBuffers。照办

checksum.update(bbtest1);
checksum.update(bbtest2);

创建数据的另一个副本没有任何好处,NIO包含分散/聚集方法,可以同时对多个ByteBuffers进行操作。

您需要在通道的PUT或READ之后调用flip,为获取或写入通道准备缓冲区,然后将其压缩

但我根本不知道你为什么要连接ByteBuffers。照办

checksum.update(bbtest1);
checksum.update(bbtest2);

创建另一个数据副本没有任何好处,NIO包含分散/聚集方法,可以同时对多个ByteBuffers进行操作。

倒带可以工作,但flip在语义上更为正确。倒带是为了重读。@EJP谢谢,你说得对。当我回到非移动设备后面时,我会更新Wind works,但flip在语义上更为正确。倒带是为了重读。@EJP谢谢,你说得对。当我回到非移动设备后面时,我会更新