Python中C\u IOR函数的等价物是什么?

2024-10-01 22:44:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我最近在做一些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 *)

Tags: 代码sizelentypegroup字符numioc
2条回答

运行char*得到的数字不能保证是任何特定的数字。宏在计算keys的IOR时将字符串的地址视为整数。结果将根据keys在堆栈中的位置而变化。因此,在Python中没有一个很好的替代品来替代这个功能。在

docs for _IOR(g, n, t)

g
Specifies the group that this ioctl type belongs to. This argument must be a nonnegative 8-bit number (that is, in the range 0-255 inclusive). You can pass the value zero (0) to this argument if a new ioctl group is not being defined.

函数的预期用途是将一个字节作为第一个参数(通过字符或整数类型)。也就是说,“钥匙”可能是被分配给某个随机组的。我会选择一个您认为不会被占用的组(或者在您的C代码中查找它当前分配给的组并使用该编号)来代替keys。在

或者,您可以始终只取输入字符串的第一个字符,并将其视为组id

def _IOR(group, number, size):
    if isinstance(group, basestring):
        group = ord(group[0]) if group else 0
    return _IOC(_IOC_READ, group, number, size)

那么_IOR('t', 3, 1)和{}仍将运行,尽管组分配与C宏不同。但由于宏被错误地用于keys赋值,我认为这不会是个问题。在

'keys'是一个整数字符常量(包含四个字符),其值由实现定义。您声明了C代码_IOR('keys', 1, unsigned char *)返回的值是-444763391,它是一个4字节的十六进制数0xE57D7301。由此我们可以得出这样的结论:此实现从'k'<<24|'e'<<16|'y'<<8|'s'计算'keys'的整数值0x6B657973。_IOR值0xE57D7301来自表达式

2<<30|4<<16|'keys'<<8|1
:     :     :         :
:     :     :         1 = num n
:     :     'keys' = group g
:     4 = sizeof (unsigned char *)
2 = _IOC_READ

-注意,一个类型(组)值只保留了8位,这种对32位值的创造性使用使类型溢出到大小和DIR位(与它们一起使用“或”运算),其最重要的字节(由'k'<<24产生)甚至被移出int值。在

使用Python函数,可以通过调用

^{pr2}$

(由于k丢失,我们可以直接丢弃它)。在

相关问题 更多 >

    热门问题