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?

War es hilfreich?

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";
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top