Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取python中的FileMapping对象(改编自c+;+;)_Python_C++_Shared Memory - Fatal编程技术网

读取python中的FileMapping对象(改编自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;

我有一个将文件映射写入共享内存的进程,并希望用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?
全面回购:

我在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++定义类的方法? 如果你对我没有得到的其他观点有解释,欢迎你。 (另外,如果你有一个更好的标题,因为它可能看起来像一个副本)

谢谢