in hessian-lite/src/main/java/com/alibaba/com/caucho/hessian/io/Hessian2Input.java [1500:1652]
public int readString(char[] buffer, int offset, int length)
throws IOException {
int readLength = 0;
if (_chunkLength == END_OF_DATA) {
_chunkLength = 0;
return -1;
} else if (_chunkLength == 0) {
int tag = read();
switch (tag) {
case 'N':
return -1;
case 'S':
case BC_STRING_CHUNK:
_isLastChunk = tag == 'S';
_chunkLength = (read() << 8) + read();
break;
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f:
_isLastChunk = true;
_chunkLength = tag - 0x00;
break;
case 0x30:
case 0x31:
case 0x32:
case 0x33:
_isLastChunk = true;
_chunkLength = (tag - 0x30) * 256 + read();
break;
default:
throw expect("string", tag);
}
}
while (length > 0) {
if (_chunkLength > 0) {
buffer[offset++] = (char) parseUTF8Char();
_chunkLength--;
length--;
readLength++;
} else if (_isLastChunk) {
if (readLength == 0)
return -1;
else {
_chunkLength = END_OF_DATA;
return readLength;
}
} else {
int tag = read();
switch (tag) {
case 'S':
case BC_STRING_CHUNK:
_isLastChunk = tag == 'S';
_chunkLength = (read() << 8) + read();
break;
case 0x00:
case 0x01:
case 0x02:
case 0x03:
case 0x04:
case 0x05:
case 0x06:
case 0x07:
case 0x08:
case 0x09:
case 0x0a:
case 0x0b:
case 0x0c:
case 0x0d:
case 0x0e:
case 0x0f:
case 0x10:
case 0x11:
case 0x12:
case 0x13:
case 0x14:
case 0x15:
case 0x16:
case 0x17:
case 0x18:
case 0x19:
case 0x1a:
case 0x1b:
case 0x1c:
case 0x1d:
case 0x1e:
case 0x1f:
_isLastChunk = true;
_chunkLength = tag - 0x00;
break;
case 0x30:
case 0x31:
case 0x32:
case 0x33:
_isLastChunk = true;
_chunkLength = (tag - 0x30) * 256 + read();
break;
default:
throw expect("string", tag);
}
}
}
if (readLength == 0)
return -1;
else if (_chunkLength > 0 || !_isLastChunk)
return readLength;
else {
_chunkLength = END_OF_DATA;
return readLength;
}
}