gpt4 book ai didi

python - 将 C bitfiddling 移植到 Python 的惯用方法

转载 作者:太空宇宙 更新时间:2023-11-03 15:25:58 29 4
gpt4 key购买 nike

您将如何以 Pythonic 方式移植以下 C 代码(尤其是 Get2、Get3 中的位摆弄部分……)

switch(mem[pos-1])
{
...
case 0x10: pos+=Get2(&mem[pos+0x02])+0x04; break;
case 0x11: pos+=Get3(&mem[pos+0x0F])+0x12; break;
case 0x16: pos+=Get4(&mem[pos+0x00])+0x04; break;
...
case 0x20: pos+=0x02; break;
}

...

//////////////////////////////////////////////////////////
// Conversion routines to fetch bytes in Big Endian order
//////////////////////////////////////////////////////////

unsigned int Get2(unsigned char *pointer)
{
return (pointer[0] | (pointer[1]<<8));
}

unsigned int Get3(unsigned char *pointer)
{
return (pointer[0] | (pointer[1]<<8) | (pointer[2]<<16));
}

unsigned int Get4(unsigned char *pointer)
{
return (pointer[0] | (pointer[1]<<8) | (pointer[2]<<16) | (pointer[3]<<24));
}

这是我目前所得到的:

    x = struct.unpack('B', mem[pos-1])[0]

if x == 0x10:
# pos += ???
continue

if x == 0x11:
# pos += ???
continue

if x == 0x16:
# pos += ???
continue

if x == 0x20:
pos += 0x02
continue

最佳答案

如果你只是得到一个无符号字节,就这样做

x = ord(mem[pos - 1])

在 Python 2 或

x = mem[pos - 1]

在 Python 3 上。

你想要的不是 select/case,而是字典。

positions = {0x10: do_10, 0x11: do_12, 0x16: do_16}

do_10等是函数:

def do_10(pos):
# This actually would need an endianness character
return struct.unpack('H', mem[pos + 0x02])[0] + 0x04

你可以这样使用它:

pos += positions[mem[pos - 1]](pos)

如果你想直接在字典中定义函数,你可以:

positions = {
# This actually would need an endianness character
0x10: (lambda pos: struct.unpack('H', mem[pos + 0x02])[0] + 0x04)
# ...
}

关于python - 将 C bitfiddling 移植到 Python 的惯用方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779900/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com