in juneau-core/juneau-marshall/src/main/java/org/apache/juneau/msgpack/MsgPackInputStream.java [79:376]
DataType readDataType() throws IOException {
int i = read();
if (i == -1)
throw new IOException("Unexpected end of file found at position "+pos);
currentDataType = TYPES[i];
switch (currentDataType) {
case NULL:
case FLOAT: {
length = 4;
break;
}
case DOUBLE: {
length = 8;
break;
}
case BOOLEAN: {
lastByte = i;
break;
}
case INT: {
// positive fixnum stores 7-bit positive integer
// +--------+
// |0XXXXXXX|
// +--------+
//
// negative fixnum stores 5-bit negative integer
// +--------+
// |111YYYYY|
// +--------+
//
// * 0XXXXXXX is 8-bit unsigned integer
// * 111YYYYY is 8-bit signed integer
//
// uint 8 stores a 8-bit unsigned integer
// +--------+--------+
// | 0xcc |ZZZZZZZZ|
// +--------+--------+
//
// uint 16 stores a 16-bit big-endian unsigned integer
// +--------+--------+--------+
// | 0xcd |ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+
//
// uint 32 stores a 32-bit big-endian unsigned integer
// +--------+--------+--------+--------+--------+
// | 0xce |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+--------+--------+
//
// uint 64 stores a 64-bit big-endian unsigned integer
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+
// | 0xcf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+
//
// int 8 stores a 8-bit signed integer
// +--------+--------+
// | 0xd0 |ZZZZZZZZ|
// +--------+--------+
//
// int 16 stores a 16-bit big-endian signed integer
// +--------+--------+--------+
// | 0xd1 |ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+
//
// int 32 stores a 32-bit big-endian signed integer
// +--------+--------+--------+--------+--------+
// | 0xd2 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+--------+--------+
//
// int 64 stores a 64-bit big-endian signed integer
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+
// | 0xd3 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+
lastByte = i;
if (i <= POSFIXINT_U)
length = 0;
else if (i >= NEGFIXINT_L)
length = -1;
else if (i == INT8 || i == UINT8)
length = 1;
else if (i == INT16 || i == UINT16)
length = 2;
else if (i == INT32)
length = 4;
else
length = 0;
break;
}
case LONG: {
if (i == UINT32)
length = 4;
else if (i == INT64 || i == UINT64)
length = 8;
else
length = 0;
break;
}
case STRING:{
// fixstr stores a byte array whose length is up to 31 bytes:
// +--------+========+
// |101XXXXX| data |
// +--------+========+
//
// str 8 stores a byte array whose length is up to (2^8)-1 bytes:
// +--------+--------+========+
// | 0xd9 |YYYYYYYY| data |
// +--------+--------+========+
//
// str 16 stores a byte array whose length is up to (2^16)-1 bytes:
// +--------+--------+--------+========+
// | 0xda |ZZZZZZZZ|ZZZZZZZZ| data |
// +--------+--------+--------+========+
//
// str 32 stores a byte array whose length is up to (2^32)-1 bytes:
// +--------+--------+--------+--------+--------+========+
// | 0xdb |AAAAAAAA|AAAAAAAA|AAAAAAAA|AAAAAAAA| data |
// +--------+--------+--------+--------+--------+========+
//
// where
// * XXXXX is a 5-bit unsigned integer which represents N
// * YYYYYYYY is a 8-bit unsigned integer which represents N
// * ZZZZZZZZ_ZZZZZZZZ is a 16-bit big-endian unsigned integer which represents N
// * AAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA is a 32-bit big-endian unsigned integer which represents N
// * N is the length of data
if (i <= FIXSTR_U)
length = i & 0x1F;
else if (i == STR8)
length = readUInt1();
else if (i == STR16)
length = readUInt2();
else
length = readUInt4();
break;
}
case ARRAY: {
// fixarray stores an array whose length is up to 15 elements:
// +--------+~~~~~~~~~~~~~~~~~+
// |1001XXXX| N objects |
// +--------+~~~~~~~~~~~~~~~~~+
//
// array 16 stores an array whose length is up to (2^16)-1 elements:
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+
// | 0xdc |YYYYYYYY|YYYYYYYY| N objects |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+
//
// array 32 stores an array whose length is up to (2^32)-1 elements:
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
// | 0xdd |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N objects |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
//
// where
// * XXXX is a 4-bit unsigned integer which represents N
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N
// N is the size of a array
if (i <= FIXARRAY_U)
length = i & 0x0F;
else if (i == ARRAY16)
length = readUInt2();
else
length = readUInt4();
break;
}
case BIN:{
// bin 8 stores a byte array whose length is up to (2^8)-1 bytes:
// +--------+--------+========+
// | 0xc4 |XXXXXXXX| data |
// +--------+--------+========+
//
// bin 16 stores a byte array whose length is up to (2^16)-1 bytes:
// +--------+--------+--------+========+
// | 0xc5 |YYYYYYYY|YYYYYYYY| data |
// +--------+--------+--------+========+
//
// bin 32 stores a byte array whose length is up to (2^32)-1 bytes:
// +--------+--------+--------+--------+--------+========+
// | 0xc6 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| data |
// +--------+--------+--------+--------+--------+========+
//
// where
// * XXXXXXXX is a 8-bit unsigned integer which represents N
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N
// * N is the length of data
if (i == BIN8)
length = readUInt1();
else if (i == BIN16)
length = readUInt2();
else
length = readUInt4();
break;
}
case EXT:{
// fixext 1 stores an integer and a byte array whose length is 1 byte
// +--------+--------+--------+
// | 0xd4 | type | data |
// +--------+--------+--------+
//
// fixext 2 stores an integer and a byte array whose length is 2 bytes
// +--------+--------+--------+--------+
// | 0xd5 | type | data |
// +--------+--------+--------+--------+
//
// fixext 4 stores an integer and a byte array whose length is 4 bytes
// +--------+--------+--------+--------+--------+--------+
// | 0xd6 | type | data |
// +--------+--------+--------+--------+--------+--------+
//
// fixext 8 stores an integer and a byte array whose length is 8 bytes
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
// | 0xd7 | type | data |
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
//
// fixext 16 stores an integer and a byte array whose length is 16 bytes
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
// | 0xd8 | type | data
// +--------+--------+--------+--------+--------+--------+--------+--------+--------+--------+
// +--------+--------+--------+--------+--------+--------+--------+--------+
// data (cont.) |
// +--------+--------+--------+--------+--------+--------+--------+--------+
//
// ext 8 stores an integer and a byte array whose length is up to (2^8)-1 bytes:
// +--------+--------+--------+========+
// | 0xc7 |XXXXXXXX| type | data |
// +--------+--------+--------+========+
//
// ext 16 stores an integer and a byte array whose length is up to (2^16)-1 bytes:
// +--------+--------+--------+--------+========+
// | 0xc8 |YYYYYYYY|YYYYYYYY| type | data |
// +--------+--------+--------+--------+========+
//
// ext 32 stores an integer and a byte array whose length is up to (2^32)-1 bytes:
// +--------+--------+--------+--------+--------+--------+========+
// | 0xc9 |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| type | data |
// +--------+--------+--------+--------+--------+--------+========+
//
// where
// * XXXXXXXX is a 8-bit unsigned integer which represents N
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a big-endian 32-bit unsigned integer which represents N
// * N is a length of data
// * type is a signed 8-bit signed integer
// * type < 0 is reserved for future extension including 2-byte type information
if (i == FIXEXT1)
length = 1;
else if (i == FIXEXT2)
length = 2;
else if (i == FIXEXT4)
length = 4;
else if (i == FIXEXT8)
length = 8;
else if (i == FIXEXT16)
length = 16;
else if (i == EXT8)
length = readUInt1();
else if (i == EXT16)
length = readUInt2();
else if (i == EXT32)
length = readUInt4();
extType = read();
break;
}
case MAP:{
// fixmap stores a map whose length is up to 15 elements
// +--------+~~~~~~~~~~~~~~~~~+
// |1000XXXX| N*2 objects |
// +--------+~~~~~~~~~~~~~~~~~+
//
// map 16 stores a map whose length is up to (2^16)-1 elements
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+
// | 0xde |YYYYYYYY|YYYYYYYY| N*2 objects |
// +--------+--------+--------+~~~~~~~~~~~~~~~~~+
//
// map 32 stores a map whose length is up to (2^32)-1 elements
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
// | 0xdf |ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ|ZZZZZZZZ| N*2 objects |
// +--------+--------+--------+--------+--------+~~~~~~~~~~~~~~~~~+
//
// where
// * XXXX is a 4-bit unsigned integer which represents N
// * YYYYYYYY_YYYYYYYY is a 16-bit big-endian unsigned integer which represents N
// * ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ_ZZZZZZZZ is a 32-bit big-endian unsigned integer which represents N
// * N is the size of a map
// * odd elements in objects are keys of a map
// * the next element of a key is its associated value
if (i <= FIXMAP_U)
length = i & 0x0F;
else if (i == MAP16)
length = readUInt2();
else
length = readUInt4();
break;
}
default:
throw new IOException("Invalid flag 0xC1 detected in stream.");
}
return currentDataType;
}