public int[] toInt4() {
    // 64 bits for indexingFileStamp (48 is enough in most cases, if you want to save 16 bits)
    // 1 bit for binary flag
    // 31 bits for indexingCharLength, unsigned
    // 32 bits for indexingByteLength, signed for simplicity (files >2GB are represented with 2^31-1)

    // we don't actually use indexingByteLength for diagnostics (see contentLengthMatches), so we can reduce stored size by 1 int,
    // still it is useful for debugging, until we find a better way to utilize this space (we can only store 2 or 4 ints per file, not 3)

    int binary = isBinary ? 0x80_00_00_00 : 0;
    int[] ints = new int[4];
    ints[0] = (int)(indexingFileStamp & 0x0_ff_ff_ff_ffL);
    ints[1] = (int)((indexingFileStamp >> 32) & 0x0_ff_ff_ff_ffL);
    ints[2] = indexingCharLength | binary;
    ints[3] = (int)min(indexingByteLength, Integer.MAX_VALUE);
    return ints;
  }
public int[] toInt4()