转换为c++;指向python的指针代码 我有一个C++代码片段,需要转换为Python: static void decrypt buff(常量unit8\u t key,char*buf,常量size\u t n){ 用于(自动ptr=buf;ptr

转换为c++;指向python的指针代码 我有一个C++代码片段,需要转换为Python: static void decrypt buff(常量unit8\u t key,char*buf,常量size\u t n){ 用于(自动ptr=buf;ptr,python,Python,发送到“DecryptBuff”的值是某个变量的地址。变量的数据类型可以是任何类型,因此“for”不容易使用 我知道python没有指针,有没有其他方法可以解决这个问题?您基本上将指针用作数组。您可以使用,它的工作方式与C数组类似。您可以使用Pythonlist为Cchar*buf编写此代码,对列表进行变异,使其包含结果,但更具Python风格的方法是创建一个包含xor编码字节的新缓冲区并返回它 使用较旧版本的Python,您可以创建buf字符串中每个字符的ord()值列表,用键xor该列表的元

发送到“DecryptBuff”的值是某个变量的地址。变量的数据类型可以是任何类型,因此“for”不容易使用


我知道python没有指针,有没有其他方法可以解决这个问题?

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

您可以使用Python
list
为C
char*buf
编写此代码,对列表进行变异,使其包含结果,但更具Python风格的方法是创建一个包含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!'
original  bytearray(b'Hello, world!') Hello, world!
encrypted bytearray(b'bOFFE\x06\n]EXFN\x0b')
decrypted bytearray(b'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  'Hello, world!'
encrypted 'bOFFE\x06\n]EXFN\x0b'
decrypted 'Hello, world!'
original  bytearray(b'Hello, world!') Hello, world!
encrypted bytearray(b'bOFFE\x06\n]EXFN\x0b')
decrypted bytearray(b'Hello, world!')

输入的Python类型是什么?您是否试图迭代数组并更改其内容?我会使用genex,这样就不会创建中间列表。@IgnacioVazquez Abrams:Fair call。OTOH,在创建生成器时会有额外的开销,它们可能会稍微慢一点,所以如果我们只处理相对较短的字符串,那么使用genex可能不值得。