private void initializeFields(byte[] encodedFieldTypes) throws UnsupportedFieldException {

		if (encodedFieldTypes.length == 0) {
			fields = new Field[0];
			return;
		}

		int index = 0;

		ArrayList<Field> fieldList = new ArrayList<>();
		while (index < encodedFieldTypes.length) {
			byte b = encodedFieldTypes[index++];
			if (b == FIELD_EXTENSION_INDICATOR) {
				break;
			}
			Field f = Field.getField(b);
			fieldList.add(f);
			if (f.isVariableLength()) {
				isVariableLength = true;
			}
			fixedLength += f.length();
		}
		fields = fieldList.toArray(new Field[fieldList.size()]);

		while (index < encodedFieldTypes.length) {
			int extensionType = encodedFieldTypes[index++];
			if (extensionType == SPARSE_FIELD_LIST_EXTENSION) {
				index += parseSparseColumnIndexes(encodedFieldTypes, index);
			}
			else {
				throw new UnsupportedFieldException(
					"Unsupported field extension type: " + extensionType);
			}
		}

		if (isVariableLength) {
			fixedLength = 0;
		}
	}
Initialize field types and related field extensions (e.g., sparse field list).
The presence of field extensions within the encodedFieldTypes is indicated by a
-1 (field extension indicator) following the encoded field types.  
The byte value following the field extension indicator
is the extension type which is followed by the extension data if applicable.
A -1 byte is used to separate each extension byte sequence.
@param encodedFieldTypes encoded field type data
@throws UnsupportedFieldException if decoding of the encodedFieldTypes fails
Ghidra/Framework/DB/src/main/java/db/Schema.java