private unsafe static Boolean HexNumberToUInt64(ref NumberBuffer number, ref UInt64 value) {
Int32 i = number.scale;
if (i > UInt64Precision || i < number.precision) {
return false;
}
Char* p = number.digits;
BCLDebug.Assert(p != null, "");
UInt64 n = 0;
while (--i >= 0) {
if (n > (0xFFFFFFFFFFFFFFFF / 16)) {
return false;
}
n *= 16;
if (*p != '\0') {
UInt64 newN = n;
if (*p != '\0') {
if (*p >= '0' && *p <= '9') {
newN += (UInt64)(*p - '0');
}
else {
if (*p >= 'A' && *p <= 'F') {
newN += (UInt64)((*p - 'A') + 10);
}
else {
BCLDebug.Assert(*p >= 'a' && *p <= 'f', "");
newN += (UInt64)((*p - 'a') + 10);
}
}
p++;
}
// Detect an overflow here...
if (newN < n) {
return false;
}
n = newN;
}
}
value = n;
return true;
}