Как обработать отрицательный или неподписанный символ при переносе из C / C ++ в JavaScript?

Я пытаюсь портировать старый лексер C ++ (источник) к JavaScript, и я немного борюсь с моим непониманием C / C ++.

У меня есть параметр c который, как я сейчас вижу, может быть индексом позиции во входном файле, который я анализирую (*yy_cp) или фактический (включая нуль) символ, сохраненный по этому адресу. Мне нужно использовать c в качестве индекса в таблице поиска. Лексер делает это:

/* Promotes a possibly negative, possibly signed char to an
* unsigned integer for use as an array index.  If the signed char
* is negative, we want to instead treat it as an 8-bit unsigned
* char, hence the double cast.
*/
#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c)

и называет это так:

register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)];

который будет хранить значение таблицы поиска yy_ec который содержит 256 записей (я предполагаю, расширенный ASCII), в yy_c, Позиция для поиска генерируется YY_SC_TO_UI и вот где я потерял портирование этого на JavaScript. YY_SC_TO_UI должен вернуть число от 0 до 255, поэтому я просто беру то, что у меня есть, и:

 "[c]".charCodeAt(0)

или есть еще что-то, что мне нужно знать о том, как обрабатывать «возможный отрицательный, возможный подписанный символ» в JS?

Благодарю.

0

Решение

В зависимости от компилятора char может быть signed или же unsigned, Предположительно, автор хотел, чтобы это работало одинаково, и чтобы при преобразовании из значения всегда было нулевое расширение, а не расширение знака. char в unsigned int, Безопасный способ убедиться, что значение равно 0..255, а не -128..127.

Согласно MDN, диапазон возвращаемого значения charCodeAt больше:

Метод charCodeAt () возвращает целое число от 0 до 65535 …

От вашего ввода зависит, как вы хотите обрабатывать возможные значения вне диапазона, но одной альтернативой может быть простая битовая маскировка:

"€".charCodeAt(0) & 0xff;
1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]