I have some 256-character strings of hexadecimal characters which represent a sequence of bit flags, and I'm trying to convert them back into a bitstring so I can manipulate them with &
, |
, vec
and the like. The hex strings are written in integer-wide big-endian groups, such that a group of 8 bytes like "76543210"
should translate to the bitstring "\x10\x32\x54\x76"
, i.e. the lowest 8 bits are 00001000
.
The problem is that pack
's "h
" format works on one byte of input at a time, rather than 8, so the results from just using it directly won't be in the right order. At the moment I'm doing this:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
which works, but feels hackish. It seems like there ought to be a cleaner way, but my pack
-fu is not very strong. Is there a better way to do this translation?