एक स्ट्रिंग $ 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
(यह पागलपन है।)