САБЖ Есть ли какая-то встроенная функция в Сях либо апишка, чтобы перевести строку типа 0x1234 в число (дворд) ЗЫ: для десятеричных чисел обычно использую atoi
Все, разобрался РСДН рулит ) Код (Text): Преобразование строки в число Выполнить преобразование строки в число можно многими способами - выбор конкретного зависит от ваших целей на момент написания кода. Есть штатные способы - ряд библиотечных функций, есть более изощренные, есть совсем уж извращенные годные разве что для экзерсисов в области программирования. Начну с самых простых. Первый, и, наверное, самый распространенный, но далеко не самый лучший - использование штатных библиотечных функций atoi, atof, atol. Эти функции входит в стандартную библиотеку языка и присутствует в любом компиляторе. Их объявления выглядит так: int atoi(const char* str) long atol(const char* str) double atof(const char* str) На вход они принимают указатель на строку, завершенную нулем, а возвращают - число, которое этой строкой описывается. atoi и atol воспринимают следующий формат числа: [пробелы][знак]цифры а atof, соответственно: [пробелы][знак][цифры][.цифры][{d | D | e | E }[знак]цифры] Здесь пробелы - любой из знаков пробела, табуляции (\t), вертикальной табуляции (\v) - они игнорируются. Знак - символ '+' или '-'. Если не указан, то считается, что число положительное. Цифры - символы от '0' до '9'. Для числа с плавающей точкой, если не указаны цифры до знака '.', то должна быть указана хотя бы одна цифра после него. После дробной части может быть указана экспонента, следующая за одним из символов-префиксов экспоненты. Основной недостаток этих функций заключается в том, что они никак не сигнализируют об ошибке, если таковая произошла в процессе разбора переданной строки. Под ошибкой я понимаю невозможность корректно разобрать переданный набор символов - несоответствие его формату или по иным причинам. Эту проблему решает следующий набор библиотечных функций, также включенных в стандартную библиотеку: long strtol(const char* str, char** end_ptr, int radix) unsigned long strtoul(const char* str, char** end_ptr, int radix) double strtod(const char* str, char** end_ptr) Эти функции имеют следующие отличия от предыдущей группы: * Через параметр end_ptr они возвращают указатель на первый символ, который не может быть интерпретирован как часть числа. * Контролируют переполнение и, если таковое произошло, сигнализируют об этом выставлением значения переменной errno в ERANGE, а также возвращают, соответственно, LONG_MAX/LONG_MIN, ULONG_MAX/ULONG_MIN и +/-HUGE_VAL в зависимости от знака числа в переданной строке. * strtod использует информацию о текущих установленных (через setlocale) региональных настройках, таким образом может корректно интерпретировать числа с символом ',' в качестве разделителя целой и дробной части. * Для функций strtol и strtoul можно указать основание системы счисления. При этом, если в качестве основания передан 0, то основание определяется автоматически по первым символам числа. Если это символ '0', а сразу за ним идет цифра - то основание принимается равным 8. Если первая цифра '0', а за ней идет символ 'x' или 'X', то основание принимается равным 16. В остальных случаях основание принимается равным 10. В качестве цифр в этом случае можно использовать символы '0' - '9' и 'A' - 'Z' или 'a' - 'z', а основание может принимать значения от 2 до 36. * Если варианты этих функций для преобразования чисел, описанных unicode-строками. Они, соответственно, носят названия wcstol wcstoul и wcstod. Типичное использование этих функций такое: CODE char* end_ptr; long val = strtol(str, &end_ptr, 10); if (*end_ptr) { // Сигнализируем об ошибке в строке } if ((val == LONG_MAX || val == LONG_MIN) && errno == ERANGE) { // Сигнализируем о переполнении } // Продолжаем штатную работу.
Самописные варианты принимаются? Если да, то вот: Код (Text): HexStrToDWORD proc _s:DWORD; XOR EAX, EAX; MOV ECX, _s; CMP BYTE PTR [ECX], 0; JE @exit; ADD ECX, 2; <---- Пропускаем "0х" MOVZX EDX, BYTE PTR [ECX]; @loop: SHL EAX, 4; LEA EAX, [EAX+EDX+10-"A"]; CMP EDX, "9"; JG @skip; ADD EAX, "A"-"9"-1; @skip: ADD ECX, 1; MOVZX EDX, BYTE PTR [ECX]; TEST EDX, EDX; JNE @loop; @exit: RET; HexStrToDWORD endp; Жаль система счисления не восьмеричная. А то можно было бы вычислять значение всего за один LEA... ЗЫЖ: это то, чем я пользуюсь сам. Принимаются любые предложения по доводке и оптимизации!