docs: public BinaryString keyValue(byte split1, byte split2, BinaryString keyName) {
  		ensureMaterialized();
  		if (keyName == null || keyName.getSizeInBytes() == 0) {
  			return null;
  		}
  		if (inFirstSegment() && keyName.inFirstSegment()) {
  			// position in byte
  			int byteIdx = 0;
  			// position of last split1
  			int lastSplit1Idx = -1;
  			while (byteIdx < sizeInBytes) {
  				// If find next split1 in str, process current kv
  				if (segments[0].get(offset + byteIdx) == split1) {
  					int currentKeyIdx = lastSplit1Idx + 1;
  					// If key of current kv is keyName, return the value directly
  					BinaryString value = findValueOfKey(split2, keyName, currentKeyIdx, byteIdx);
  					if (value != null) {
  						return value;
  					}
  					lastSplit1Idx = byteIdx;
  				}
  				byteIdx++;
  			}
  			// process the string which is not ends with split1
  			int currentKeyIdx = lastSplit1Idx + 1;
  			return findValueOfKey(split2, keyName, currentKeyIdx, sizeInBytes);
  		} else {
  			return keyValueSlow(split1, split2, keyName);
  		}
  	}