- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我最近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)
但我不知道第二次调用“键”的等效项。有没有办法在 Python 中执行下面的 C 调用?
_IOR('keys', 1, unsigned char *)
最佳答案
'keys'
是一个整数字符常量(包含四个字符),其值是实现定义的。您声明 C 代码返回的值 _IOR('keys', 1, unsigned char *)
是 -444763391,即 4 字节十六进制数 0xE57D7301。由此我们可以得出结论,此实现计算了 'keys'
的整数值 0x6B657973。来自 'k'<<24|'e'<<16|'y'<<8|'s'
. _IOR
值 0xE57D7301 来自表达式
2<<30|4<<16|'keys'<<8|1
: : : :
: : : 1 = num n
: : 'keys' = group g
: 4 = sizeof (unsigned char *)
2 = _IOC_READ
- 请注意,只有 8 位保留用于 TYPE(组)值,这种创造性地使用 32 位值使得 TYPE 溢出到 SIZE 和 DIR 位(与它们进行或运算)及其最高有效字节(来自 'k'<<24
) 甚至被移出 int
值(value)。
使用 Python 函数,您可以通过调用计算相同的值
_IOR(ord('e')<<16|ord('y')<<8|ord('s'), 1, 4)
(因为 k
丢失了,我们可以直接放弃它)。
关于python - Python 中的 C _IOR 函数等效于什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20500947/
我最近looking在一些 C 代码和“翻译”到 Python 但卡在一个名为 _IOR 的特定函数上。它在 sys/ioctl.h 中定义如下: #define _IOC(inout,group,n
任何人都可以告诉我为什么在使用 ndk 编译 cpp 代码时会出现此错误: C:/ndk/samples/fmservice/src/jni/JFmRxNative.cpp:304:24: error
我是一名优秀的程序员,十分优秀!