读取python中的FileMapping对象(改编自c++)

2024-06-09 07:52:13 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个进程,它将文件映射写入共享内存,并希望用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++定义类的方法? 如果你对我没有得到的其他观点有解释的话,欢迎你。 (同样,如果你有一个更好的标题,因为它可能看起来像一个复制品)

谢谢


Tags: 函数代码mapreadaccessmpnullfile