Konvertieren gruppiert Hex-Zeichen in eine Bitkette in Perl
-
21-08-2019 - |
Frage
Ich habe einige 256-Zeichenkette von hexadezimalen Zeichen, die eine Folge von Bit-Flags repräsentieren, und ich versuche, sie in einen Bitstring zurück zu konvertieren, damit ich sie mit &
, |
, vec
und dergleichen zu manipulieren. Der Hexstring geschrieben wird in ganzzahlige weiten Big-Endian-Gruppen, so dass eine Gruppe von 8 Bytes wie "76543210"
zum Bitstring "\x10\x32\x54\x76"
übersetzen soll, das heißt, die untersten 8 Bits 00001000
.
Das Problem ist, dass pack
die „h
“ Format auf einer Byte Eingang zu einem Zeitpunkt arbeitet, anstatt 8, so dass die Ergebnisse von nur direkt mit nicht in der richtigen Reihenfolge sein. Im Moment mache ich das:
my $bits = pack("h*", join("", map { scalar reverse $_ } unpack("(A8)*", $hex)));
, die arbeitet, fühlt sich aber hackish. Es scheint, wie es sollte ein sauberer Weg sein, aber meine pack
-fu ist nicht sehr stark. Gibt es einen besseren Weg, diese Übersetzung zu tun?
Lösung
my $hex = "7654321076543210"; # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits); #: 1032547610325476
Andere Tipps
Betrachten Sie die ausgezeichneten Bit :: Vector verwendet wird.
Mit der hex Funktion der Hex-String in Perl die interne Darstellung des einzuschalten Anzahl, tun sie Ihre bitweise Operationen, und verwenden sie sprintf , um sie wieder in die hex-String :
#!/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";