final void unpack(byte[] rec) {
		int offs = 0;
		curr = rec[offs++];
		dirty = rec[offs++] != 0;
		databaseFormatVersion = rec[offs++];
		root = new RootPage[2];

		for (int i = 0; i < 2; i++) {
			root[i] = new RootPage();
			root[i].size = Bytes.unpack8(rec, offs);
			offs += 8;
			root[i].index = Bytes.unpack8(rec, offs);
			offs += 8;
			root[i].shadowIndex = Bytes.unpack8(rec, offs);
			offs += 8;
			root[i].usedSize = Bytes.unpack8(rec, offs);
			offs += 8;
			root[i].indexSize = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].shadowIndexSize = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].indexUsed = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].freeList = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].bitmapEnd = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].rootObject = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].classDescList = Bytes.unpack4(rec, offs);
			offs += 4;
			root[i].bitmapExtent = Bytes.unpack4(rec, offs);
			offs += 4;
		}

		transactionId = Bytes.unpack8(rec, offs);
		offs += 8;
		Assert.that(offs == sizeof);
	}