byte[] block = new byte[blockSize];
int count = 0;
while (true) {
MessageDigest messageDigest = MessageDigest.getInstance(HASH_ALGORITHM);
ByteArrayOutputStream buff = new ByteArrayOutputStream();
DigestOutputStream dout = new DigestOutputStream(buff, messageDigest);
int blockLen = IOUtils.readFully(in, block, 0, block.length);
count++;
if (blockLen == 0) {
break;
} else if (blockLen < blockSizeMin) {
idStream.write(TYPE_DATA);
IOUtils.writeVarInt(idStream, blockLen);
idStream.write(block, 0, blockLen);
totalLength += blockLen;
} else {
dout.write(block, 0, blockLen);
byte[] digest = messageDigest.digest();
idStream.write(TYPE_HASH);
IOUtils.writeVarInt(idStream, level);
if (level > 0) {
IOUtils.writeVarLong(idStream, totalLength);