Руководство пользователя для GNU Awk
15. Библиотека функций awk
15.5 Перевод символов в числовой код
Одна из коммерческих реализаций awk имеет встроенную функцию ord, которая получает символ и возвращает численное значение этого символа в машинном множестве символов. Если цепочка, переданная ord, содержит более одного символа, используется только первый из них.
Обратная функция есть chr (аналогична функции с тем же именем в Паскале), которая получает число и возвращает символ. Обе функции могут быть просто написаны в awk; нет существенных причин для встраивания их в интерпретатор.
# ord.awk --- делает ord и chr # # глобальными идентификаторами:
# .ord.: численное значение символа
# .ord.init: функция инициализации .ord.
# # Arnold Robbins # arnold@gnu.org # Public Domain # 16 January, 1992
# 20 July, 1992, revised
BEGIN - .ord.init() "" function .ord.init( low, high, i, t) -
low = sprintf("%c", 7) # BEL есть ascii 7 если (low == ""a")
- # regular ascii
low = 0 high = 127 "" else if (sprintf("%c", 128 + 7) == ""a") -
# ascii, отметка четности low = 128 high = 255 "" else - # ebcdic(!)
low = 0 high = 255 ""
for (i = low; i != high; i++) -
t = sprintf("%c", i) .ord.[t] = i "" ""
Следует дать некоторые объяснения о числах, используемых в chr. Наиболее известное сейчас множество символов есть ASCII. Хотя восьмибитовый байт может иметь 256 различных значений (от нуля до 255), ASCII определяет только символы со значениями от 0 до 127. *2* По крайней мере один изготовитель компьютеров, которого мы знаем, использует ASCII с отмеченной четностью, означающей, что самый левый бит в байте имеет всегда значение 1. Это значит, что на таких системах
2 ASCII используется во многих странах для представления в значениях от 128 до 255 специальных символов этой страны. Если ваша система использует такое расширение, вы можете упростить .ord.init до простого цикла от 0 до 255.
символы имеют численное значение от 128 to 255. Наконец, большие универсальные системы используют систему символов EBCDIC, которая использует все 256 значений. Хотя на некоторых старых системах используются другие множества символов, о них не стоит говорить.
function ord(str, c) -
# интерес представляет только первый символ
c = substr(str, 1, 1) return .ord.[c] ""
function chr(c) -
# превращайте с в число добавлением 0
return sprintf("%c", c + 0) ""
#### test code #### # BEGIN " # - # for (;;) - # printf("enter a character: ")
# if (getline var != 0) # break # printf("ord(%s) = %d"n", var, ord(var)) # ""
# ""
Очевидным усовершенствованием для этих функций было бы перенести код функции .ord.init в тело правила BEGIN. Это и было так написано первоначально для облегчения разработки. Имеется и "тестовая программа" в правиле BEGIN для проверки функции. Она превращена в комментарий для увеличения производительности.
Назад | Вперед
Содержание (общее) | Содержание раздела
Если Вы не нашли что искали, то рекомендую воспользоваться поиском по сайту:
|