将c ++指针代码转换为python

时间:2014-11-15 05:03:16

标签: 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没有指针,有没有其他方法可以解决这个问题?

2 个答案:

答案 0 :(得分:0)

您基本上将指针用作数组。您可以使用array.array,它的工作方式与C数组类似。

答案 1 :(得分:0)

您可以使用Python list为C char *buf编写此内容,对列表进行变更以使其包含结果,但更多Pythonic方法是创建包含xor编码的新缓冲区字节并返回它。

使用旧版本的Python,您可以在buf字符串中创建每个字符的ord()值列表,使用您的密钥xor该列表的元素,使用{将int转换回字符{1}},然后chr()将个人字符串回一个字符串。但是使用更现代的Python版本,您可以使用bytearray来完成大部分的脏工作。

join()

<强>输出

#! /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`

但是,如果你真的想更密切地模仿C代码并改变original 'Hello, world!' encrypted 'bOFFE\x06\n]EXFN\x0b' decrypted 'Hello, world!' ,你可以很容易地做到这一点,如下所示:

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`