Преобразование между символами и 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



2013-09-10 17:05:19

Proverte kod v komentariyah gde pro list tam oshibki detskie




Оставить комментарий:
Ваше Имя:
Email:
Антибот: *  
Ваш комментарий: