Спасибо всем заранее.
Я хотел бы получить доступ к n-му байту двоичного скаляра. Например, вы можете получить все данные файла в одной скалярной переменной ...
Представьте, что двоичные данные собираются в скаляр ...
open(SOURCE, "<", "wl.jpg");
my $thisByteData = undef;
while(<SOURCE>){$thisByteData .= $_;}
close SOURCE;
$ thisByteData - это необработанные двоичные данные. Когда я использую длину ($ thisByteData), я возвращаю счетчик байтов, поэтому Perl знает, насколько он велик. У меня вопрос, как я могу получить доступ к N-му байту?
Примечание: моя функция получит этот двоичный скаляр, и в моей функции я хочу получить доступ к N-му байту. Помощь относительно того, как собрать эти данные, приветствуется, но не то, что я ищу. Какой бы способ ни другой программист хотел собрать двоичные данные, зависит от них, моя работа состоит в том, чтобы получить N-й байт при его передаче мне:)
Еще раз большое спасибо за помощь всем!
Спасибо @muteW, который продвинул меня дальше, чем когда-либо. Я думаю, что я не понимаю, распаковать (...) правильно.
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 (...) имеет массу опций, поэтому я рекомендую всем, кто читает это, прочитать документацию pack / unpack, чтобы получить результат байтовых данных по своему выбору. Я также не пытался использовать упомянутые опции Tie @brian, я хотел сделать код как можно более простым.