/ / पर्ल: एक मनमाना स्ट्रिंग को देखते हुए, आप पहले N बिट्स कैसे निकालते हैं? - पर्ल

पर्ल: एक मनमानी स्ट्रिंग को देखते हुए, आप पहली एन बिट्स कैसे निकालते हैं? - पर्ल

एक स्ट्रिंग $ old_str को देखते हुए, मैं निकालने की कोशिश कर रहा हूं$ new_str में पहला N बिट्स (बाइट्स नहीं)। मैं पैक प्रलेखन और perlpacktut पढ़ रहा हूँ, लेकिन मैं उलझन में हूँ। यह वह जगह है जहां मैं वर्तमान में खड़ा हूं:

my $old_str = "9876543210";
# Extract the first 5 bits
my $new_str = pack("B5", unpack("B*", $old_str));
printf "%#b | %#bn", $new_str, $old_str;

यह पैदा करता है:

0b1000 | 0b1001001100101100000001011011101010

लेकिन मैं यह चाहता हूं:

0b10010 | 0b1001001100101100000001011011101010

उत्तर:

उत्तर № 1 के लिए 1

आप vec में निर्मित चाहते हैं: vec


जवाब के लिए 0 № 2

आप उपयोग कर सकते हैं unpack:

my $bit_string = unpack( "b*", $old_str );

यह 80 "1" s (char 0x31s) और "0" s (char 0x30s) की एक स्ट्रिंग बनाएगा। विंडोज पर, आपको संभवतः जोड़ना होगा reverse.


जवाब के लिए 0 № 3

मुझे यकीन नहीं है कि आप यहां क्या करने की कोशिश कर रहे हैं। unpack("B*", $old_str) एक बिट स्ट्रिंग बनाता है जिसमें निम्नलिखित बिट्स होते हैं (पठनीयता के लिए रिक्त स्थान जोड़े जाते हैं):

00111001 00111000 00110111 00110110 00110101 00110100 00110011 00110010 00110001 00110000

... दूसरे शब्दों में, आपके पात्रों के लिए ASCII संख्याओं के अनुरूप एक सा तार:

$ perl -E "printf("%#b ", ord) for split(//, "9876543210")"
0b111001 0b111000 0b110111 0b110110 0b110101 0b110100 0b110011 0b110010 0b110001 0b110000

फिर आप करते हैं pack("B5", "00111001…") जो थोड़ा जटिल लगता है। ऐसा लग रहा है pack पहले 8-ट्यूपल में पांच सबसे दाहिने बिट्स से मिलकर एक बाइट देता है (11001)। जो 56 या देता है 8 स्ट्रिंग (एएससीआईआई के लिए) 8 56 है):

$ perl -E "say ord pack("B5", "00111001…")"
56
$ perl -E "say pack("B5", "00111001…")"
8

और जब आप printf स्ट्रिंग, आपको नंबर 8 का द्विआधारी संख्यात्मक प्रतिनिधित्व मिलता है:

$ perl -E "say printf "%#b", "8""
0b10001

(यह पागलपन है।)