2013-12-10 19 views
5

Ich bin neu in Python. In Perl, um bestimmte Bits auf eine skalare Variable (Ganzzahl) zu setzen, kann ich vec() wie unten verwenden.Python entspricht perl vec() Funktion

#!/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"); 

Ausgang:

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

Ich frage mich, wie man das gleiche in Python zu erreichen, ohne Bit-Manipulations Code zu schreiben und struct.pack manuell mit?

+0

Wenn Sie Bit-Manipulations Code sagen, meinen Sie Bitshift << >>? – user2958652

+2

Sie sagen, es setzt die Bits 0 bis 3, 4 bis 7 usw., aber es setzt Nibbles 3 (Bits 12 bis 15), 7 (Bits 28 bis 31) usw. Es sollte einfach sein, Ihre eigenen 'Vec zu schreiben 'wenn es kein Äquivalent gibt. – ikegami

+2

Vielleicht würde die Frage [Bit-Array in Python] (http://stackoverflow.com/q/11669178/2157640) helfen. – Palec

Antwort

0

Nicht sicher, wie die Vec-Funktion in Perle funktioniert (nicht mit der Vec-Funktion gearbeitet). Gemäß der von Ihnen erwähnten Ausgabe funktioniert der folgende Code in Python jedoch einwandfrei. Ich sehe die Bedeutung des zweiten Arguments nicht. So rufen Sie die Vec-Funktion auf: vec (Wert, Größe). Jedes Mal, wenn Sie dies tun, wird die Ausgabezeichenfolge mit der globalen final_str-Variablen verknüpft.


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

Wenn Sie wirklich eine Hex-String von Knabbereien erstellen möchten, können Sie es auf diese Weise lösen könnte

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