2013-12-10 8 views
5

मैं पाइथन के लिए नया हूं। पर्ल में, स्केलर वैरिएबल (पूर्णांक) में विशिष्ट बिट्स सेट करने के लिए, मैं नीचे vec() का उपयोग कर सकता हूं।पायथन के बराबर perl vec() फ़ंक्शन

#!/usr/bin/perl -w 
$vec = ''; 
vec($vec, 3, 4) = 1; # bits 0 to 3 
vec($vec, 7, 4) = 10; # bits 4 to 7 
vec($vec, 11, 4) = 3; # bits 8 to 11 
vec($vec, 15, 4) = 15; # bits 12 to 15 

print("vec() Has a created a string of nybbles, 
in hex: ", unpack("h*", $vec), "\n"); 

आउटपुट:

vec() Has a created a string of nybbles, 
     in hex: 0001000a0003000f 

मैं सोच रहा था कि कैसे, पायथन में एक ही प्राप्त करने के लिए थोड़ा हेरफेर कोड लिखने के लिए होने और struct.pack मैन्युअल का उपयोग किए बिना?

+0

जब आप कहते हैं कि थोड़ा हेरफेर कोड तुम्हारा मतलब bitshift << > का समाधान कर सकता>? – user2958652

+2

आप कहते हैं कि यह बिट्स 0 से 3, 4 से 7 इत्यादि सेट करता है लेकिन यह निबल्स 3 (बिट्स 12 से 15), 7 (बिट्स 28 से 31) इत्यादि सेट करता है। किसी भी तरह से, इसे अपना स्वयं का 'वीसी लिखना आसान होना चाहिए 'अगर समकक्ष नहीं है। – ikegami

+2

शायद सवाल [पायथन में बिट सरणी] (http://stackoverflow.com/q/11669178/2157640) मदद करेगा। – Palec

उत्तर

0

सुनिश्चित नहीं है कि वीर फ़ंक्शन मोती में कैसे काम करता है (वीसी फ़ंक्शन के साथ काम नहीं किया है)। हालांकि, आपके द्वारा उल्लिखित आउटपुट के अनुसार, पाइथन में निम्न कोड ठीक काम करता है। मुझे दूसरे तर्क का महत्व नहीं दिखता है। Vec फ़ंक्शन को इस तरह कॉल करने के लिए: vec (मान, आकार)। हर बार जब आप ऐसा करते हैं, आउटपुट स्ट्रिंग को वैश्विक final_str चर के साथ जोड़ा जाएगा।


final_vec = '' 
def vec(value, size): 
    global final_vec 
    prefix = '' 
    str_hex = str(hex(value)).replace('0x','') 
    str_hex_size = len(str_hex) 
    for i in range (0, size - str_hex_size): 
     prefix = prefix + '0' 
    str_hex = prefix + str_hex 
    final_vec = final_vec + str_hex 
    return 0  
vec(1, 4) 
vec(10, 4) 
vec(3, 4) 
vec(15, 4) 
print(final_vec) 
0

तुम सच में निबल से एक हेक्स स्ट्रिंग का निर्माण करना चाहते हैं, तो आप इसे इस तरह

nibbles = [1,10,3,15] 
hex = '0x' + "".join([ "%04x" % x for x in nibbles])