2015-12-03 67 views
0

我需要一些幫助。我是python的新手。我正試圖完成下面這是用Python編寫的C++。以下是我有:翻譯數組操作在C++到Python

C++:

uint16_t value = (ReadData[1] << 8 | ReadData[2]); 
int num = (short) value; 
int total = ((0.89*num)+48.31); 

的Python:

ReadData = [0]*6 
arr = bytes(ReadData) 
value = arr2[0:3] 

不知道怎麼被吐了出來,像這樣的陣列採取: b'\xff\xff\xce'一個符號整型。

預先感謝您。

+0

您能描述一下您想實現的語義嗎? – MaxNoe

回答

2

由於您使用bytesbytes文字我猜你在Python 3中,在這種情況下,你必須轉換字節的任意運行到int一個更好的常規選項。 Python 3在一個轉換器中有着驚人的效果。舉個例子:

>>> int.from_bytes(b'\xff\xff\xce', 'big', signed=True) 
-50 

它縮放到很大的尺寸,運行速度比其他任何可用的。

如果你不使用Python 3的時候,這是稍微難看,但還是相當快:

import binascii 

def int_from_bytes(b): 
    x = int(binascii.hexlify(b), 16) 
    mask = 1 << (len(b) << 3) - 1 
    if x & mask: 
     x -= mask << 1 
    return x 

它得到了相同的結果Python 3的內置當你這樣做:

>>> int_from_bytes(b'\xff\xff\xce') 
-50 

注性能:預編譯struct.Struct會贏,倒手,如果這真的是一個填充字節之後是簽署short,沒有可變長度廢話一樣簡單。在這種情況下,你會預編譯Struct有:

unpacker = struct.Struct('>xh').unpack 

然後你可以使用它像這樣:

x, = unpacker(b'\xff\xff\xce') 

後面的逗號是很重要的(Struct.unpack在這種情況下返回長度1元組,並分配給x,將單個值解包爲x可能的最有效方式

+0

如果你真的只想處理兩個字節,而你在'ReadData'中有一個值,你想跳過一個字節並且接下來兩個字節,你可以這樣做'int.from_bytes(ReadData [1:3 ],'big',signed = True)''('[1:3]'slice會抽出你想要的字節)或compat hack,'int_from_bytes(ReadData [1:3])''。 – ShadowRanger

0

Python支持是非常類似於C++位運算。如果你有Python的int數組這叫ReadData,你可以做如下:

value = (ReadData[1] & 0xFF) << 8 | (ReadData[2] & 0xFF) 
total = ((0.89 * value) + 48.31) 

& 0xFF去除一切,但數量,這似乎是你想要的最低字節。

0

使用struct模塊將bytes string解釋爲C數據

如果你想詮釋的ReadData字節1和2 大端符號16位integar,做到:

import struct 

ReadData = b'\xff\xff\xce' 

# ReadData[1:] takes from ReadData[1] until ReadData[-1] (the last one) 
num = struct.unpack('>h', ReadData[1:]) 
# Now num is -50 

到這將是等價的:

# Convert ReadData to unsigned int 
num = (ReadData[1] & 0xFF) << 8 | (ReadData[2] & 0xFF) 

# Change sign, assuming we got 16-bit number 
num = num - 0x10000 

轉換numtotal應該是微不足道的:

total = ((0.89*num)+48.31) 
然而

注意0.89 * num投它浮動,因此可能想要做的,而不是,

total = int((0.89 * num) + 48.31) 
+0

如果實際上只是您關心的兩個字節關於(雖然手動強制否定,而不檢查高位,但在移位和屏蔽代碼中表現不佳)。如果他們需要處理三個(並且Python中的切片將全部三個拉到一起),那麼'struct'不會有太大幫助,因爲它可以處理兩種尺寸的冪。 – ShadowRanger

+0

@ShadowRanger,謝謝,沒有太多的應用知識,很難提供更一般/安全的答案。假設「ReadData」長度爲3個字節,我認爲這聽起來像說對(1,2)是你的整數是任意的。 – memoselyk