سؤال

ولدي بعض الجمل 256 حرف من الحروف الست عشرية التي تمثل سلسلة من أعلام بعض الشيء، وأنا أحاول لتحويلها مرة أخرى إلى bitstring حتى أتمكن من التلاعب بها مع &، |، vec وما شابه ذلك. تتم كتابة سلاسل عرافة في مجموعات endian كبيرة على نطاق صحيح، مثل أن مجموعة من 8 بايت مثل "76543210" يجب أن تترجم إلى "\x10\x32\x54\x76" bitstring، أي أدنى 8 بت هي 00001000.

والمشكلة هي أن شكل pack في "h" يعمل على بايت واحد من المدخلات في وقت واحد، بدلا من 8، وبالتالي فإن النتائج من مجرد استخدامه سوف لا تكون مباشرة في الترتيب الصحيح. في هذه اللحظة أنني أفعل هذا:

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

والذي يعمل، ولكن يشعر hackish. يبدو أن هناك يجب أن يكون وسيلة أكثر نظافة، ولكن لي pack فو ليست قوية جدا. هل هناك طريقة أفضل للقيام بذلك الترجمة؟

هل كانت مفيدة؟

المحلول

my $hex = "7654321076543210";  # can be as long as needed
my $bits = pack("V*", unpack("N*", pack("H*", $hex)));
print unpack("H*", $bits);  #: 1032547610325476

نصائح أخرى

وحاول استخدام بت :: ناقل .

واستخدم عرافة وظيفة لتحويل سلسلة عرافة في التمثيل الداخلي للبيرل عدد، القيام بعمليات المختصة بالبت الخاص بك، واستخدام 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