Germany | Finland | Saint Petersburg | Drive

Chr() и Ord() в QPILE

Опубликовано в QPILE

алфавитВ языке QPILE отсутствуют функции получения кода символа и обратная - получение символа по его коду.  Большинство задач, для которых создавался этот язык, действительно не нуждаются в этих функциях. Однако в некоторых случаях они все-таки требуются. Как правило, это уже довольно сложные алгоритмы, нуждающиеся в использовании методов хеширования или шифрации.

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

Первый способ. Идем стандартным путем. Выбраем все символы, которые могут содержаться в литералах на языке QPILE. Это буквы (прописные и заглавные), цифры, знаки препинания и прочие. Для простоты неотображаемые символы (а они тоже могут быть внутри текстовых литералов) не будем рассматривать. В соответствии с Таблицей ASCII  кодов разобьем все этим символы по группам  таким образом, чтобы внутри каждой группы символы шли по возрастанию их кодов в соответствии со стандартом ASCII. Например, такими группами будут все латинские заглавные буквы (A-Z) или символы, начиная с пробела и заканчивающиеся вопросительным знаком.

Код символа @ известен - 64 (десятичное). За ним без пропусков идут все латинские заглавные буквы.  Чтобы узнать код ASCII, например, буквы F, применим стандартную QPILE функцию FIND()

code = find("@ABCDEFGHIJKLMNOBPQRSTUVWXYZ[\]",0,"F") 

if code != -1

     code = code + 64

end if

Таким образом, мы проверили, является ли символ буквой или символом "@" и в случае, если является - получили его код. Если не является - продолжаем проверки на другие диапазоны точно таким же способом. В конце концов методом перебора мы найдем подходящий диапазон и получим код символа в кодировке ASCII. Главное, чтобы все диапазоны были пунктуально прописаны. Приводить таблицу кодов ASCII я не буду, это не секретная информация, ее легко найти. Например, в поставку  Windows входит утилита "Таблица символов" - очень удобно. Реализация обратной функции Chr() - по обратному принципу. Занудно, но совместимо со стандартом ANSI.

Второй способ. Приведенный выше метод хорош тем, что дает код в стандартной кодировке, однако размер функции для получения этого кода становится несколько неприличным. Если мы хотим пользоваться функциями chr() и ord() только внутри нашей программы, что мешает нам создать собственную таблицу символов? Создаём строку, в которой будут перечислены все возможные символы и просто ищем в ней нужный. Позиция символа в строке и будет кодом символа. Быстро и просто. Для получения символа по коду вполне достаточно функции substr(), которая получает символ из строки алфавита по коду, понимая его как смещение от начала стоки алфавита. Алфавит в этом случае можно делать как статическим, так и формировать его на лету, если это требуется.

Третий способ. Создаём в двоичном редакторе файл, состоящий из символов ASCII от 01 до 255. В QPILE-портфеле на первой итерации зачитываем его в голобальную переменную. Теперь простым поиском при помощи функции Find() для любого символа ищем номер его номер в нашей строке. Он и будет кодом символа.

Добавить комментарий