Почему parseInt ('dsff66', 16) возвращает 13?

Низкоуровневые манипуляторы клавиатуры / мыши, предоставленные SetWindowsHookEx() , сообщают, если вход был сгенерирован реальными устройствами или введен в код приложения.

Для параметра low -level hook , хук обеспечивает указатель на структуру KBDLLHOOKSTRUCT , которая имеет член flags, который содержит флагов LLKHF_INJECTED для поддельного ввода.

Для низкоуровневого мышиного крюка , крючок предоставляет указатель на структуру MSLLHOOKSTRUCT , которая имеет член flags, который содержит либо LLMHF_INJECTED ] или LLMHF_LOWER_IL_INJECTED для фальшивого ввода.

Любой крючок может вернуть ненулевое значение, чтобы заблокировать ввод от остальных цепочек крюка и, следовательно, к целевому окну.

Что касается API исходного входа, в соответствии с ( более старая версия 1) документация для функции GetRawInputDeviceInfo() :

hDevice [in, optional] Тип: HANDLE

Ручка для исходного устройства ввода. Это происходит из lParam сообщения WM_INPUT, из члена hDevice из RAWINPUTHEADER или из GetRawInputDeviceList. Он также может быть NULL, если приложение вставляет входные данные, например, с помощью SendInput.

blockquote>

1: выделенная заметка была удалена в текущей версии документации, я не знаю почему.

Таким образом, hDevice, который сообщается сообщением WM_INPUT , будет NULL для поддельного ввода.

однако, это не возможно заблокировать ввод с помощью API Raw Input. Для этого вам нужен хук низкого уровня.

27
задан Lee Taylor 24 September 2014 в 12:54
поделиться

2 ответа

For radices above 10, the letters of the alphabet indicate numerals greater than 9. For example, for hexadecimal numbers (base 16), A through F are used.

В вашей строке dsff66 d - это шестнадцатеричный символ (даже если строка не шестнадцатеричная), которая соответствует типу radix и эквивалентна числу 13. После этого он прекращает синтаксический анализ, поскольку следующий символ не является шестнадцатеричным, а следовательно, и результатом.

6
ответ дан nlmm01 24 September 2014 в 12:54
поделиться

parseInt считывает ввод, пока не встретит недопустимый символ, а затем использует любой действительный ввод, прочитанный до этого недопустимого символа. Рассмотрим:

parseInt("17days", 10);

Это будет использовать вход 17 и пропустить все после недействительного d.

Из спецификации ECMAScript :

Если [входная строка] S содержит какой-либо символ, который не является цифрой радикс-R, то пусть Z [строка будет целым числом -ified] - подстрока в S, состоящая из всех символов перед первым таким символом ; в противном случае пусть Z будет S.

В вашем примере s является недопустимым символом base-16, поэтому parseInt использует только начальный d.

Что касается , почему это поведение было включено: нет способа узнать наверняка, но вполне вероятно, что это попытка воспроизвести поведение strtol (от строки к длинной ) из стандартной библиотеки C. Со страницы руководства strtol(3) :

... строка преобразуется в длинное значение int очевидным образом, останавливаясь на первом символе, который является недопустимая цифра в данной базе .

Эта связь далее поддерживается (до некоторой степени) тем фактом, что оба parseInt и strtol определены, чтобы игнорировать начальные пробелы, и они оба могут принять ведущий 0x для шестнадцатеричных значений.

43
ответ дан apsillers 24 September 2014 в 12:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: