【发布时间】:2013-12-10 17:15:37
【问题描述】:
我最近在looking 处理一些 C 代码并“翻译”为 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))
我已经看到它以这些方式调用:
_IOR('t', 3, int)
_IOR('keys', 1, unsigned char *)
“keys”调用是我需要做的。看起来它正在对字符串进行按位运算。
我设法找到了与上述等效的 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)
但我不知道第二次调用'keys'的等价物。有没有办法在 Python 中执行以下 C 调用?
_IOR('keys', 1, unsigned char *)
【问题讨论】:
-
在第二个示例中,宏不是将某些堆栈常量“键”的地址或地址放入您的结果中吗?似乎宏不是为评估 char *...而构建的...
-
它肯定是在字符串键上做的,虽然我不确定如何;它甚至可以编译和运行!我链接到的线程中有一点背景;这是供应商提供的样本:link。它给了我一个神奇的数字 -444763391,我试图弄清楚如何而不是硬编码。