我有一个进程,它将文件映射写入共享内存,并希望用Python访问它。但是我不知道文件映射有什么形状。你知道吗
我找到了一个在c++中运行得非常好的解决方案,但是有一部分我搞不清楚,因为我不是c++的人。你知道吗
简化C++代码:
struct STelemetry {
struct SHeader {
char Magic[32];
Nat32 Version;
Nat32 Size;
};
};
#MAIN
HANDLE hMapFile = NULL;
void* pBufView = NULL;
const volatile STelemetry* Shared = NULL;
hMapFile = OpenFileMapping(FILE_MAP_READ, FALSE, "MP_Telemetry"); #FileMap Handle
pBufView = (void*)MapViewOfFile(hMapFile, FILE_MAP_READ, 0, 0, 4096); #Pointer to MapView (string of bytes ?)
Shared = (const STelemetry*)pBufView; #Somehow cast string of bytes to class?
完全回购:https://github.com/Electron-x/TMTelemetry/blob/master/TMTelemetry.cpp
我用Python改编的:
from ctypes import *
FILE_MAP_ALL_ACCESS = 0xF001F
INVALID_HANDLE_VALUE = 0xFFFFFFFF
FALSE = 0
TRUE = 1
SHMEMSIZE = 4096 #Just copied this value form c++ code
hMapObject = windll.kernel32.OpenFileMappingW(FILE_MAP_ALL_ACCESS, FALSE, "MP_Telemetry") #OpenFileMappingA for ansi encoding, OpenFileMappingW for unicode
pBuf = windll.kernel32.MapViewOfFile(hMapObject, FILE_MAP_ALL_ACCESS, 0, 0, SHMEMSIZE)
在这一点上,PBUF是一个int值,我认为它代表指针,所以我只想读取指向的值,并在C++代码中创建一个与STelemetry一样的对象。 C++代码中的{{CD1}}在Python中没有等价的,所以我尝试打印它,认为我可以从字符串创建一个类。你知道吗
我试过各种方法:
import mmap
shmem = mmap.mmap(0, SHMEMSIZE, "ManiaPlanet_Telemetry", mmap.ACCESS_READ)
print(shmem.read(SHMEMSIZE).decode("utf-8")) # Using OpenFileMappingW
# If SHMEMSIZE = 256: MP_Telemetry t . Stadium.....
# If SHMEMSIZE = 4096 UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb2 in position 40
print(shmem.read(SHMEMSIZE).decode("ansi")) # Using OpenFileMappingA
# MP_Telemetry t . Stadium.....
shmem.close()
“mpu遥测”和“体育场”是我想要的东西。但基本上其他的都是胡言乱语。 使用A函数和Ansi似乎更好,对吗?但是使用A函数,pBuf=0总是,所以指针是空的,但仍然返回一个字符串。。。 我试过一堆其他的解码器,结果什么也没有出来。你知道吗
其他解决方案:
x = cast(pBuf, c_char_p)
print(x.value)
但是我使用A函数得到None
,使用W函数得到退出代码0xc000005(拒绝访问)
所以问题是:如何解释字节字符串?在Python(cType?)中有没有使用C++定义类的方法? 如果你对我没有得到的其他观点有解释的话,欢迎你。 (同样,如果你有一个更好的标题,因为它可能看起来像一个复制品)
谢谢
目前没有回答
相关问题 更多 >
编程相关推荐