2012-05-09 2 views
2

Я не уверен в лучшем способе описать это.Преобразование бит-бит в двоичный файл в Perl

По существу, я пытаюсь написать буфер, который требует определенного протокола. Первые два байта, которые я бы хотел, были «10000001» и «11111110» (побитно). Как я могу записать эти два байта в дескриптор файла в Perl?

ответ

4

Для преобразования произносимого бинарного фактических байт, вы хотите pack функции с любой B или b (в зависимости от того, у вас есть биты):

print FILE pack('B*', '1000000111111110'); 

Однако, если байты являются постоянными, вероятно, лучше преобразовать их в шестнадцатеричные значения и использовать escape-код \x с строковым литералом:

print FILE "\x81\xFE"; 
1

Как насчет

# open my $fh, ... 
print $fh "\x81\xFE"; # 10000001 and 11111110 
1

Начиная с версии 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₁₆. Числа в левом столбце являются смещениями: байты специальных маркеров начинаются со смещения нуля (то есть, сразу), и их ровно два.

Смежные вопросы