in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java [3536:3615]
int read(byte[] buffer, int offset, int length)
throws IOException {
int readLength = 0;
while (length > 0) {
while (_chunkLength <= 0) {
if (_isLastChunk)
return readLength == 0 ? -1 : readLength;
int code = read();
switch (code) {
case BC_BINARY_CHUNK:
case 'b': //maybe it's a mistype of BC_BINARY_CHUNK
_isLastChunk = false;
_chunkLength = (read() << 8) + read();
break;
case BC_BINARY:
_isLastChunk = true;
_chunkLength = (read() << 8) + read();
break;
case 0x20:
case 0x21:
case 0x22:
case 0x23:
case 0x24:
case 0x25:
case 0x26:
case 0x27:
case 0x28:
case 0x29:
case 0x2a:
case 0x2b:
case 0x2c:
case 0x2d:
case 0x2e:
case 0x2f:
_isLastChunk = true;
_chunkLength = code - 0x20;
break;
case 0x34:
case 0x35:
case 0x36:
case 0x37:
_isLastChunk = true;
_chunkLength = (code - 0x34) * 256 + read();
break;
default:
throw expect("byte[]", code);
}
}
int sublen = _chunkLength;
if (length < sublen)
sublen = length;
if (_length <= _offset && !readBuffer())
return -1;
if (_length - _offset < sublen)
sublen = _length - _offset;
System.arraycopy(_buffer, _offset, buffer, offset, sublen);
_offset += sublen;
offset += sublen;
readLength += sublen;
length -= sublen;
_chunkLength -= sublen;
}
return readLength;
}