我最近在做一些C代码的looking,并“翻译”成Python,但却被一个名为_IOR
的特定函数卡住了。它在sys/ioctl.h
中定义如下:
#define _IOC(inout,group,num,len) \
(inout | ((len & IOCPARM_MASK) << 16) | ((group) << 8) | (num))
#define _IOR(g,n,t) _IOC(IOC_OUT, (g), (n), sizeof(t))
我看到它是这样叫的:
^{pr2}$“钥匙”电话是我要做的。看起来它在对字符串执行位操作。在
我设法找到了与上面相同的Python代码,但它只适用于单个字符。在
_IOC_NRBITS = 8
_IOC_TYPEBITS = 8
_IOC_SIZEBITS = 14
_IOC_DIRBITS = 2
_IOC_NRSHIFT = 0
_IOC_TYPESHIFT =(_IOC_NRSHIFT+_IOC_NRBITS)
_IOC_SIZESHIFT =(_IOC_TYPESHIFT+_IOC_TYPEBITS)
_IOC_DIRSHIFT =(_IOC_SIZESHIFT+_IOC_SIZEBITS)
_IOC_NONE = 0
_IOC_WRITE = 1
_IOC_READ = 2
def _IOC(direction,type,nr,size):
return (((direction) << _IOC_DIRSHIFT) |
((type) << _IOC_TYPESHIFT) |
((nr) << _IOC_NRSHIFT) |
((size) << _IOC_SIZESHIFT))
def _IOR(type, number, size):
return _IOC(_IOC_READ, type, number, size)
这适用于单字符调用。在
_IOR(ord('t'), 3, 1)
但我不知道第二个电话是什么意思。有没有一种方法可以在Python中完成下面的C调用?在
_IOR('keys', 1, unsigned char *)
运行char*得到的数字不能保证是任何特定的数字。宏在计算
keys
的IOR时将字符串的地址视为整数。结果将根据keys
在堆栈中的位置而变化。因此,在Python中没有一个很好的替代品来替代这个功能。在从docs for _IOR(g, n, t):
函数的预期用途是将一个字节作为第一个参数(通过字符或整数类型)。也就是说,“钥匙”可能是被分配给某个随机组的。我会选择一个您认为不会被占用的组(或者在您的C代码中查找它当前分配给的组并使用该编号)来代替
keys
。在或者,您可以始终只取输入字符串的第一个字符,并将其视为组id
那么}仍将运行,尽管组分配与C宏不同。但由于宏被错误地用于
_IOR('t', 3, 1)
和{keys
赋值,我认为这不会是个问题。在'keys'
是一个整数字符常量(包含四个字符),其值由实现定义。您声明了C代码_IOR('keys', 1, unsigned char *)
返回的值是-444763391,它是一个4字节的十六进制数0xE57D7301。由此我们可以得出这样的结论:此实现从'k'<<24|'e'<<16|'y'<<8|'s'
计算'keys'
的整数值0x6B657973。_IOR
值0xE57D7301来自表达式-注意,一个类型(组)值只保留了8位,这种对32位值的创造性使用使类型溢出到大小和DIR位(与它们一起使用“或”运算),其最重要的字节(由
'k'<<24
产生)甚至被移出int
值。在使用Python函数,可以通过调用
^{pr2}$(由于
k
丢失,我们可以直接丢弃它)。在相关问题 更多 >
编程相关推荐