четверг, 2 июля 2009 г.

hex to long

Как думаете, чем конвертировать шестнадцатиричную строку в 32-х битное знаковое целое? Порывшись в стандарной библиотеке можно найти функцию strtol. И все работает обычно... до тех пор пока входные данные беззнаковые. Попробуйте конвертировать -1 (0xFFFFFFFF) и ничего не выйдет. strtol решит, что было переполнение и вернет MAX_LONG. Чтобы обойти эту особенность, следует использовать функцию strtoul. Она конвертит строку в беззнаковое целое, а уж потом можно его приравнять к long и старший бит укажет знак.

Пример:
#include <cstdlib>
#include <iostream>
using namespace std;

int main() {
string s = "FFFFFFFF";
char * p;
long n = strtoul( s.c_str(), &p, 16 );
// overflow when using long n = strtol( s.c_str(), &p, 16 );
if ( * p != 0 ) {
cout << "not a number" << endl;
} else {
cout << n << endl; // prints -1
}
}

Комментировать в ВКонтакте