读取python中的FileMapping对象(改编自c+;+;)
我有一个将文件映射写入共享内存的进程,并希望用Python访问它。但是,我不知道文件映射的形状 我发现一个在C++中完美的解决方案,但是有一部分我不能理解,因为我不是C++的人。读取python中的FileMapping对象(改编自c+;+;),python,c++,shared-memory,Python,C++,Shared Memory,我有一个将文件映射写入共享内存的进程,并希望用Python访问它。但是,我不知道文件映射的形状 我发现一个在C++中完美的解决方案,但是有一部分我不能理解,因为我不是C++的人。 简化C++代码: struct STelemetry { struct SHeader { char Magic[32]; Nat32 Version; Nat32 Size;
简化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?
全面回购:
我在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++代码做代码>共享=(const StestRealth*)pBuFVIEW;
我认为在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()
“MP_遥测”和“体育场”字符串是我想要的。但基本上其他一切都是胡言乱语。
使用A函数和Ansi似乎更好,对吗?但使用A函数时,pBuf始终为0,因此指针为null,但仍返回字符串。。。
我试过很多其他的解码器,但没有更多的结果
其他解决方案:
x = cast(pBuf, c_char_p)
print(x.value)
但是我使用A函数得到None
,使用W函数得到退出代码0xc000005(拒绝访问)
所以问题是:我如何解释这个字节字符串?在Python(cType?)中有没有使用C++定义类的方法?
如果你对我没有得到的其他观点有解释,欢迎你。
(另外,如果你有一个更好的标题,因为它可能看起来像一个副本)
谢谢