Преобразование сгруппированных шестнадцатеричных символов в битовую строку в Perl
-
21-08-2019 - |
Вопрос
У меня есть несколько 256-символьных строк шестнадцатеричных символов, которые представляют собой последовательность битовых флагов, и я пытаюсь преобразовать их обратно в битовую строку, чтобы можно было манипулировать ими с помощью &
, |
, vec
и тому подобное.Шестнадцатеричные строки записываются целочисленными группами с обратным порядком байтов, так что группа из 8 байтов типа "76543210"
следует перевести в битовую строку "\x10\x32\x54\x76"
, т.е.младшие 8 бит 00001000
.
Проблема в том, что pack
's'h
Формат работает с одним байтом ввода за раз, а не с 8, поэтому результаты от его прямого использования не будут в правильном порядке.На данный момент я делаю это:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
который работает, но кажется хакерским.Кажется, должен быть более чистый способ, но мой pack
-фу не очень сильный.Есть ли лучший способ сделать этот перевод?
Решение
my $hex = "7654321076543210"; # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits); #: 1032547610325476
Другие советы
Рассмотрите возможность использования превосходного Бит::Вектор.
Используйте шестигранной функции, чтобы включить шестнадцатеричную строку во внутреннее представление в Perl из номер, сделать ваши битовые операции, и использовать Sprintf , чтобы превратить его обратно в шестнадцатеричной строки
#!/usr/bin/perl
use strict;
use warnings;
my $hex = "76543210";
my $num = hex $hex;
$num &= 0xFFFF00FF; # Turn off the third byte
my $new_hex = sprintf("%08x", $num);
print "It was $hex and is now $new_hex.\n";