@Override
    public int decodeStrings(int valCount, long inputAddr, long outputAddr, int outputLimit) {
        if (valCount == 0) return 0;
        int dictEntriesCount = UnsafeUtil.getInt(inputAddr);
        StringsStruct dictEntriesData = new StringsStruct(dictEntriesCount, inputAddr + 4);

        ByteSlice dataEntryIds = ByteSlice.allocateDirect(valCount << 2);
        long encodeddataEntryIdsAddr = inputAddr + 4 + dictEntriesData.totalLen() + 4;
        RLEPackingHybridCodec dataCodec = new RLEPackingHybridCodec(VarInteger.bitWidth(dictEntriesCount - 1));
        int consumedSize = dataCodec.decodeInts(
                valCount,
                encodeddataEntryIdsAddr,
                dataEntryIds.address(),
                dataEntryIds.size());

        StringsStruct.Builder stringDataBuilder = new StringsStruct.Builder(valCount, outputAddr);
        OffheapBytes container = new OffheapBytes();
        for (int i = 0; i < valCount; i++) {
            int vid = dataEntryIds.getInt(i << 2);
            dictEntriesData.getString(vid, container);
            stringDataBuilder.addString(null, container.addr(), container.len());
        }
        stringDataBuilder.build();

        dataEntryIds.free();

        return 4 + dictEntriesData.totalLen() + 4 + consumedSize;
    }
<pre>
| dictSize |   dict   |  dataSize |  data(encoded ids) |
     4       dictSize       4           dataSize
</pre>
indexr-vlt-segment/src/main/java/io/indexr/vlt/codec/dict/SimpleDictCodec.java