2014-11-15 62 views
1

我有C++中的代碼段,其需要轉換成的Python:轉換C++代碼指針到Python

static void DecryptBuff (const unit8_t key, char* buf, const size_t n) { 
    for (auto ptr = buf; ptr < buf +n; ++ptr) 
     *ptr = *ptr^key; 
} 

的值被髮送到「DecryptBuff」是一些變量的地址。變量的數據類型可以是任何東西,所以「for」不易使用。

我知道python沒有指針,有沒有其他辦法可以解決這個問題?

+0

什麼是Python類型的輸入? –

+0

您是否試圖遍歷數組並更改其內容? – ppalacios

回答

0

你正在使用你的指針作爲一個數組。您可以使用array.array,其工作方式與C數組類似。

0

對於C char *buf,您可以使用Python list編寫此代碼,對列表進行變異以使其包含結果,但更多Pythonic方法是創建包含xor編碼字節的新緩衝區並將其返回。

與舊版本的Python你創建的BUF串字符每一個的ord()值的列表,XOR該列表與你的關鍵的元素,運用chr()轉換整數回字符,然後join()的個別字符回到一個單一的字符串。但是對於更現代的Python版本,您可以使用bytearray來完成大部分骯髒的工作。

#! /usr/bin/env python 

def xor_crypt(key, buf): 
    return str(bytearray([i^key for i in bytearray(buf)])) 

plaintxt = "Hello, world!" 
key = 42 

print 'original ', `plaintxt` 

encrypted = xor_crypt(key, plaintxt) 
print 'encrypted', `encrypted` 

decrypted = xor_crypt(key, encrypted) 
print 'decrypted', `decrypted` 

輸出

original 'Hello, world!' 
encrypted 'bOFFE\x06\n]EXFN\x0b' 
decrypted 'Hello, world!' 

但如果你真的要更加緊密地模仿C代碼和變異buf,你可以很容易地做到這一點,就像這樣:

#! /usr/bin/env python 

def xor_crypt(key, buf): 
    buf[:] = bytearray([i^key for i in buf]) 

plaintxt = "Hello, world!" 
key = 42 

buf = bytearray(plaintxt) 
print 'original ', `buf`, str(buf) 

xor_crypt(key, buf) 
print 'encrypted', `buf` 

xor_crypt(key, buf) 
print 'decrypted', `buf` 

輸出

original bytearray(b'Hello, world!') Hello, world! 
encrypted bytearray(b'bOFFE\x06\n]EXFN\x0b') 
decrypted bytearray(b'Hello, world!') 
+0

我會使用genex,以便不創建中間列表。 –

+0

@ IgnacioVazquez-Abrams:公平的電話。 OTOH,在創建一個發生器時會有額外的開銷,並且它們可能會稍微慢一些,所以如果我們只處理相對較短的字符串,則可能不值得使用genex。 –