Преобразование сгруппированных шестнадцатеричных символов в битовую строку в Perl

StackOverflow https://stackoverflow.com/questions/853845

Вопрос

У меня есть несколько 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";
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top