Спасибо всем заранее.
Я хотел бы получить доступ к n-му байту двоичного скаляра. Например, вы можете получить все данные файла в одной скалярной переменной...
Представьте, что бинарные данные собираются в скаляр...
open(SOURCE, "<", "wl.jpg");
my $thisByteData = undef;
while(<SOURCE>){$thisByteData .= $_;}
close SOURCE;
$thisByteData — это необработанные двоичные данные. Когда я использую length($thisByteData), я возвращаю счетчик байтов, поэтому Perl знает, насколько он велик. Мой вопрос: как я могу получить доступ к N-му байту?
Боковое примечание: моя функция получит этот двоичный скаляр, в моей функции я хочу получить доступ к N-му байту. Помощь в сборе этих данных приветствуется, но не то, что я ищу. Каким бы способом другой программист ни собирал двоичные данные, зависит от них, моя задача — получить N-й байт, когда он будет передан мне :)
Еще раз огромное всем спасибо за помощь!
Спасибо @muteW, который помог мне добиться большего, чем когда-либо. Наверное, я неправильно понимаю unpack(...).
print(unpack("N1", $thisByteData));
print(unpack("x N1", $thisByteData));
print(unpack("x0 N1", $thisByteData));
Возвращает следующее:
4292411360
3640647680
4292411360
Я бы предположил, что все эти 3 строки будут иметь доступ к одному и тому же (первому) байту. Использование без «x», а только «x» и «x $ pos» дает неожиданные результаты.
Я тоже пробовал это...
print(unpack("x0 N1", $thisByteData));
print(unpack("x1 N1", $thisByteData));
print(unpack("x2 N1", $thisByteData));
Который возвращает... то же самое, что и последний тест...
4292411360
3640647680
4292411360
Я определенно упускаю что-то о том, как работает распаковка.
Если я сделаю это...
print(oct("0x". unpack("x0 H2", $thisByteData)));
print(oct("0x". unpack("x1 H2", $thisByteData)));
print(oct("0x". unpack("x2 H2", $thisByteData)));
Я получаю то, что ожидал...
255
216
255
Не можете распаковать и дать мне это без использования oct()?
В качестве примечания: я думаю, что получаю дополнение до 2 этих байтовых целых чисел при использовании «x $ pos N1». Я ожидаю, что это первые 3 байта.
255
216
255
Еще раз спасибо за помощь всем.
Особая благодарность @brian d foy и @muteW... Теперь я знаю, как получить доступ к N-му байту моего двоичного скаляра с помощью unpack(...). У меня есть новая проблема, которую нужно решить сейчас, которая не связана с этим вопросом. Еще раз спасибо всем за помощь, ребята!
Это дало мне желаемый результат...
print(unpack("x0 C1", $thisByteData));
print(unpack("x1 C1", $thisByteData));
print(unpack("x2 C1", $thisByteData));
unpack(...) имеет массу опций, поэтому я рекомендую всем, кто читает это, прочитать документацию по упаковке/распаковке, чтобы получить результат байтовых данных по своему выбору. Я также не пытался использовать параметры Tie, упомянутые @brian, я хотел, чтобы код был как можно более простым.
binmode
в дескрипторе файла сразу после его открытия (т.е. перед началом чтения/записи). - person Michael Carman   schedule 17.07.2009