Преобразование между символами и ASCII-кодами
Проблема
Требуется вывести код, соответствующий некоторому символу в кодировке ASCII, или наоборот — символ по ASCII-коду.
Решение
Воспользуйтесь функцией
ord для преобразования символа в число или функцией
chr — для преобразования числа в символ:
$num = ord($char);
$char = chr($num);
Формат %c в функциях
printf и sprintf также преобразует число в символ:
$char = sprintf("%c", $num); # Медленнее, чем chr($num)
printf ("Number %d is character %c\n", $num, $num);
Number 101 is character e
Шаблон C*, используемый в функциях
pack и
unpack, позволяет быстро преобразовать несколько символов:
@ASCII = unpack("C*", $string);
@STRING = pack("C*", $ascii);
Комментарий
В отличие от низкоуровневых, нетипизованных языков вроде ассемблера, Perl не считает эквивалентными с
имволы и числа; эквивалентными считаются строки и числа. Это означает, что вы не можете произвольно присвоить
вместо символа его числовое представление, или наоборот. Для преобразования между символами и их числовыми
значениями в Perl существуют функции chr и ord, взятые из Pascal:
$ascii_value = ord("e"); # Теперь 101
$character = chr(101); # Теперь "е"
Символ в действительности представляется строкой единичной длины, поэтому его можно просто
вывести функцией print или с помощью формата %s функций printf и sprintf. Формат %c заставляет printf или
sprintf преобразовать число в символ, однако он не позволяет вывести символ, который уже хранится в
символьном формате (то есть в виде строки).
printf("Number %d is character %c\n", 101, 101);
Функции pack, unpack, chr и ord работают быстрее, чем sprintf. Приведем пример практического применения pack и unpack:
@ascii_character_numbers = unpack("C*", "sample");
print "@ascii_character_numbers\n";
115 97 109 112 108 101
$word = pack("C*", @ascii_character_numbers);
$word = pack("C*", 115, 97, 109, 112, 108, 101); # To же самое
print "$word\n"
sample
А вот как превратить HAL в IBM:
$hal = "HAL";
@ascii = unpuck("C*", $hal);
foreach @val (@ascii) {
@val++; # Увеличивает каждый ASCII-код на 1
}
$ibm = pack("C*", @ascii);
print "$ibm\n"; # Выводит "IBM"
Функция ord возвращает числа от 0 до 255. Этот диапазон соответствует типу данных unsigned char языка С.
См. такжеОписание функций
chr,
ord,
printf, sprintf,
pack и
unpack
Proverte kod v komentariyah gde pro list tam oshibki detskie
Оставить комментарий:
|
|