Преобразование сгруппированных шестнадцатеричных символов в цепочку битов в Perl - PullRequest
4 голосов
/ 12 мая 2009

У меня есть несколько строк из 256 символов шестнадцатеричных символов, представляющих последовательность битовых флагов, и я пытаюсь преобразовать их обратно в цепочку битов, чтобы я мог манипулировать ими с помощью &, |, vec и тому подобное. Шестнадцатеричные строки записываются в целочисленные группы с широким целым числом, так что группа из 8 байтов, такая как "76543210", должна преобразовываться в цепочку битов "\x10\x32\x54\x76", то есть младшие 8 битов 00001000.

Проблема в том, что формат pack "h" работает с одним байтом ввода за раз, а не с 8, поэтому результаты от его непосредственного использования не будут в правильном порядке. На данный момент я делаю это:

my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));

, который работает, но чувствует себя хакером. Кажется, что должен быть более чистый путь, но моя pack -фу не очень сильная. Есть ли лучший способ сделать этот перевод?

Ответы [ 3 ]

5 голосов
/ 12 мая 2009
my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476
0 голосов
/ 12 мая 2009

Рассмотрите возможность использования превосходного Бит :: Вектор .

0 голосов
/ 12 мая 2009

Используйте функцию hex , чтобы превратить шестнадцатеричную строку во внутреннее представление числа в 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";
...