Начиная с версии 5.6.0 (выпущен в марте 2000 года), Perl поддерживает binary literals, как описано в perldata:
Числовые литералы задаются в любой из следующих с плавающей запятой или целочисленных форматов:
12345
12345.67
.23E-10 # a very small number
3.14_15_92 # a very important number
4_294_967_296 # underscore for legibility
0xff # hex
0xdead_beef # more hex
0377 # octal (only numbers, begins with 0)
0b011011 # binary
Вы можете использовать символы подчеркивания (подрамники) в числовых литералах между цифрами для удобочитаемости. Например, вы можете группировать двоичные цифры по тройкам (как для аргумента режима стиля в стиле Unix, такого как 0b110_100_100
), либо четырьмя (для представления полубайтов, как в 0b1010_0110
), так и в других группах.
Вы можете захотеть, чтобы написать
print $fh 0b10000001, 0b11111110;
, но результат будет
129254
потому 10000001₂ = 129₁₀ и 11111110₂ = 254₁₀.
Вы хотите указать представление значений литералов, а именно два беззнаковых байта. Для этого используйте pack
с шаблоном "C2"
, i.e., октет раз два. Добавление подчеркивания для удобства чтения и окружив его в удобной подпрограмме дает
sub write_marker {
my($fh) = @_;
print $fh pack "C2", 0b1000_0001, 0b1111_1110;
}
В быстрой демонстрации, рассмотрит
binmode STDOUT or die "$0: binmode: $!\n"; # we'll send binary data
write_marker *STDOUT;
При запуске в
$ ./marker-demo | od -t x1
выход
0000000 81 fe
0000002
В случае он незначителен, утилита od используется здесь для презентационных целей, потому что вывод содержит контрольный символ и Þ (латинский маленький шип) в кодировке моей системы.
Вызов выше команды од для визуализации в шестнадцатеричном формате каждые байт из входных данных, который является выходом маркерных-демо. Обратите внимание, что 10000001₂ = 81₁₆ и 11111110₂ = FE₁₆. Числа в левом столбце являются смещениями: байты специальных маркеров начинаются со смещения нуля (то есть, сразу), и их ровно два.