@Override
	protected void parseInternal() throws MDException {
		if (dmang.peek() >= '0' && dmang.peek() <= '9') {
			value = BigInteger.valueOf(dmang.getAndIncrement() - '0' + 1);
		}
		else if (dmang.peek() >= 'A' && dmang.peek() <= 'P' || dmang.peek() == '@') {
			// 20170331: Discovered from encoded number ("?IAAAAAAAAAAAAAAA" which our code
			// had returned "--9223372036854775808") that Java fails us with not having an
			// unsigned long data type.  If I add an 'A' to the sequence, MSFT returns "-0"
			// which is because it is doing left shifts, which have rolled the '1' bit off
			// the left, but if I try "?IAAAAAAAAAAAAAAB" MSFT reports"-9223372036854775809"
			// meaning that MSFT is very likely using a 64-bit unsigned long.  So decided to
			// go with Java "BigInteger" for now, even though it will allow numbers bigger
			// than a 64-bit unsigned long.  I could add the logic to truncate those, but
			// we should not see those unless MSFT produces those, which should mean that
			// numbers larger than 64 bits are then the norm.
			value = new BigInteger("0");
			while ((dmang.peek() >= 'A') && (dmang.peek() <= 'P')) {
				value = value.shiftLeft(4);
				value = value.add(BigInteger.valueOf(dmang.getAndIncrement() - 'A'));
			}
			if (dmang.peek() == '@') {
				dmang.increment();
			}
		}
		else {
			throw new MDException("Illegal character at index " + dmang.getIndex() +
				" in MDEncodedNumber: " + dmang.peek());
		}
	}
This class represents an encoded number (following wiki page naming convention for
Microsoft Demangler) within a Microsoft mangled symbol.
Ghidra/Features/MicrosoftDmang/src/main/java/mdemangler/MDEncodedNumber.java