2013-12-10 83 views
5

我是Python新手。在Perl中,要將特定位設置爲標量變量(整數),我可以使用如下所示的vec()python等價的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 

我想知道如何實現在Python一樣,而不必編寫位操作代碼和struct.pack手動使用?

+0

當你說你的意思是位操作碼位位移<< >>? – user2958652

+2

你說它設置位0到3,4到7等,但它設置半字節3(位12到15),7(位28到31)等。無論哪種方式,應該很容易編寫自己的'vec '如果沒有相同的東西。 – ikegami

+2

也許這個問題[Python中的位數組](http://stackoverflow.com/q/11669178/2157640)會有所幫助。 – Palec

回答

0

不知道vec函數如何在珍珠中工作(沒有使用vec函數)。但是,根據你提到的輸出,python中的以下代碼正常工作。我沒有看到第二個論點的意義。以這種方式調用vec函數:vec(value,size)。每當你這樣做時,輸出字符串將被連接到全局的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])