将 bytes 转换为任意 C 类型
小于 1 分钟
将 bytes 转换为任意 C 类型
下面的方法实现了 bytes
转换到任意 C 类型。
from ctypes import POINTER, c_char_p, c_double, cast, sizeof
from typing import TypeVar
_T = TypeVar('_T')
def cast_bytes(data_bytes: bytes, ctype: type[_T]) -> _T:
"""Cast bytes to a ctype"""
assert len(data_bytes) >= sizeof(ctype)
return cast(
c_char_p(data_bytes),
POINTER(ctype)
).contents
v = cast_bytes(b'\x7f' * 8, c_double)
print(v.value)
这样我们就获得了一个 c_double
类型的 v
变量,使用 v.value
很容易获得其值。
以上的代码相当于下面的 C++ 代码:
#include <iostream>
using namespace std;
int main() {
char a[] = "\x7f\x7f\x7f\x7f\x7f\x7f\x7f\x7f";
double value = *(double*)a;
cout << value << endl;
return 0;
}
如果需要使用 Python 将 C 类型转换为二进制表示,使用 memoryview
即可。