public static DataOrganizationImpl restore(DBStringMapAdapter dataMap, String keyPrefix)
			throws IOException {

		boolean containsDataOrgEntries = false;
		for (String key : dataMap.keySet()) {
			if (key.startsWith(keyPrefix)) {
				containsDataOrgEntries = true;
				break;
			}
		}
		if (!containsDataOrgEntries) {
			return null;
		}

		DataOrganizationImpl dataOrg = new DataOrganizationImpl();
		
		dataOrg.bigEndian = dataMap.getBoolean(keyPrefix + BIG_ENDIAN_NAME, false);

		dataOrg.absoluteMaxAlignment =
			dataMap.getInt(keyPrefix + ELEM_ABSOLUTE_MAX_ALIGNMENT.name(),
				dataOrg.absoluteMaxAlignment);

		dataOrg.machineAlignment =
			dataMap.getInt(keyPrefix + ELEM_MACHINE_ALIGNMENT.name(), dataOrg.machineAlignment);

		dataOrg.defaultAlignment =
			dataMap.getInt(keyPrefix + ELEM_DEFAULT_ALIGNMENT.name(), dataOrg.defaultAlignment);

		dataOrg.defaultPointerAlignment =
			dataMap.getInt(keyPrefix + ELEM_DEFAULT_POINTER_ALIGNMENT.name(),
				dataOrg.defaultPointerAlignment);

		dataOrg.pointerSize =
			dataMap.getInt(keyPrefix + ELEM_POINTER_SIZE.name(), dataOrg.pointerSize);

		dataOrg.pointerShift =
			dataMap.getInt(keyPrefix + ELEM_POINTER_SHIFT.name(), dataOrg.pointerShift);

		dataOrg.isSignedChar =
			dataMap.getBoolean(keyPrefix + SIGNED_CHAR_TYPE_NAME, dataOrg.isSignedChar);

		dataOrg.charSize = dataMap.getInt(keyPrefix + ELEM_CHAR_SIZE.name(), dataOrg.charSize);

		dataOrg.wideCharSize =
			dataMap.getInt(keyPrefix + ELEM_WCHAR_SIZE.name(), dataOrg.wideCharSize);

		dataOrg.shortSize = dataMap.getInt(keyPrefix + ELEM_SHORT_SIZE.name(), dataOrg.shortSize);

		dataOrg.integerSize =
			dataMap.getInt(keyPrefix + ELEM_INTEGER_SIZE.name(), dataOrg.integerSize);

		dataOrg.longSize = dataMap.getInt(keyPrefix + ELEM_LONG_SIZE.name(), dataOrg.longSize);

		dataOrg.longLongSize =
			dataMap.getInt(keyPrefix + ELEM_LONG_LONG_SIZE.name(), dataOrg.longLongSize);

		dataOrg.floatSize = dataMap.getInt(keyPrefix + ELEM_FLOAT_SIZE.name(), dataOrg.floatSize);

		dataOrg.doubleSize =
			dataMap.getInt(keyPrefix + ELEM_DOUBLE_SIZE.name(), dataOrg.doubleSize);

		dataOrg.longDoubleSize =
			dataMap.getInt(keyPrefix + ELEM_LONG_DOUBLE_SIZE.name(), dataOrg.longDoubleSize);

		boolean firstEntry = true;
		String alignmentMapKeyPrefix = keyPrefix + ELEM_SIZE_ALIGNMENT_MAP.name() + ".";
		for (String key : dataMap.keySet()) {
			if (!key.startsWith(alignmentMapKeyPrefix)) {
				continue;
			}
			try {
				int size = Integer.valueOf(key.substring(alignmentMapKeyPrefix.length()));
				int alignment = Integer.valueOf(dataMap.get(key));
				if (firstEntry) {
					dataOrg.sizeAlignmentMap.clear();
					firstEntry = false;
				}
				dataOrg.sizeAlignmentMap.put(size, alignment);
			}
			catch (NumberFormatException e) {
				// ignore
			}
		}

		dataOrg.bitFieldPacking =
			BitFieldPackingImpl.restore(dataMap, keyPrefix + ELEM_BITFIELD_PACKING.name() + ".");

		return dataOrg;
	}
Restore a data organization from the specified DB data map.
@param dataMap DB data map
@param keyPrefix key prefix for all map entries
@return stored data organization or null if not stored
@throws IOException if an IO error occurs
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/program/model/data/DataOrganizationImpl.java