// return type, length private HeaderInfo parseHeader(Buffer buf) throws RemoteException { byte value = buf.readI8(); int h = value & 0xff; int h1 = h & ~MASK_LENGTH_1; int h2 = h & ~MASK_LENGTH_2; int v1 = h & MASK_LENGTH_1; int v2 = h & MASK_LENGTH_2; HeaderInfo info = (HeaderInfo) New.get(HeaderInfo.class); if (value >= -32) { info.type = TYPE_INTEGER; info.value = value; info.length = 0; return info; } switch (h1) { case TYPE_STRING: case TYPE_LIST: info.type = h1; if (v1 < MASK_LENGTH_1) { info.length = v1; } else { info.length = buf.readI32(); } return info; } switch (h2) { case TYPE_MAP: info.type = h2; if (v2 < MASK_LENGTH_2) { info.length = v2; } else { info.length = buf.readI32(); } return info; } switch (h) { case TYPE_NULL: case TYPE_FALSE: case TYPE_TRUE: info.type = h; info.length = 0; break; case TYPE_I8: info.type = h; info.length = 1; break; case TYPE_I16: info.type = h; info.length = 2; break; case TYPE_I32: case TYPE_F32: info.type = h; info.length = 4; break; case TYPE_I64: case TYPE_F64: info.type = h; info.length = 8; break; default: if (W) Log.warn("parsed variant: unknown type, parsed to NULL."); info.type = TYPE_NULL; info.length = 0; } return info; }