تحويل الأحرف عرافة مجمعة في bitstring في بيرل
-
21-08-2019 - |
سؤال
ولدي بعض الجمل 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";