Кто-нибудь знает, почему использование strtoull будет слишком длинным без знака? Значение "x" равно 12, когда я делаю вызов, поэтому я пытаюсь преобразовать 12-разрядную базу 36 num в unsigned long long.
Это должно работать правильно? Не имеет значения, скомпилирую ли я 32 или 64 бит. Я использую g++ на redhat.
buffer - char *
char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH;
long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);
unsigned long long orderid = strtoull((buffer + ORDERIDOFFSET), &(endPtr), 36);
Благодарю!
Кажется, вы endptr
том, что endptr
является входным параметром strtoull
, который сообщает ему, сколько времени занимает строка ввода. Это не. Это выходной параметр, который strtoull
использует, чтобы сообщить вам первый символ, который он не смог преобразовать.
Я полагаю, что ваш буфер не завершен nul; вероятно, есть алфавитно-цифровой символ, следующий за вашим 12-значным номером базы-36.
Кстати, imho, x
будет лучше вычисляться как endPtr - strPtr
. Кастинг до long
не совсем правильный.
Кажется, вы пытаетесь использовать endPtr
в качестве входного параметра. std::strtoull
принимает второй параметр в качестве выходного параметра.
Вы можете найти более надежным использование std::stoull
вместо std::strtoull
:
char *strPtr = buffer + ORDERIDOFFSET;
char *endPtr = strPtr + ORDERIDLENGTH; // assuming ORDERIDLENGTH takes you 1 passed the end of the actual ID string
std::string s(strPtr, endPtr);
unsigned long long orderid = std::stoull(s, nullptr, 36);
Дополнительно,
long x = long((endPtr)) - long(buffer + ORDERIDOFFSET);
не переносится в 64-битные системы (вы усекаете адрес). Я уверен, что вы хотите
std::size_t x = endPtr - strPtr;