Используйте ByteBuffer
и убедитесь, что порядковый номер указан правильно.
Пример
byte[] data = new byte[7];
// fill data here
ByteBuffer buf = ByteBuffer.wrap(data).order(ByteOrder.LITTLE_ENDIAN);
int d = buf.getShort() & 0x1f; // 2 bytes, 5 bits, unsigned
int m = buf.get() & 0xf; // 1 byte, 4 bits, unsigned
int y = buf.getInt(); // 4 bytes, 32 bits, signed
Конечно, год значение подписано, а не без знака, как указанный код C ++, но у вас не будет таких больших значений года.