我在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 :(得分: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`