struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
struct.error: unpack requires a buffer of 288 bytes when unpacking c++ structure
首先,如果这个问题已经被提出并回答了,我很抱歉,但我认为我的情况与我一直试图找到的其他答案不同。我也对 c++ 很陌生。
我基本上想创建一个系统,其中 c++ 程序从游戏中接收数据并通过套接字将其发送到 python 脚本。此数据作为结构存储在C++中,并作为结构发送。我目前坚持在python中接收数据并将其实际以可读的格式放置。
代码在这里:
结构:
struct SPageFilePhysics
{
int packetId = 0;
float gas = 0;
float brake = 0;
float fuel = 0;
int gear = 0;
int rpms = 0;
float steerAngle = 0;
float speedKmh = 0;
float velocity[3];
float accG[3];
float wheelSlip[4];
float wheelLoad[4];
float wheelsPressure[4];
float wheelAngularSpeed[4];
float tyreWear[4];
float tyreDirtyLevel[4];
float tyreCoreTemperature[4];
float camberRAD[4];
float suspensionTravel[4];
float drs = 0;
float tc = 0;
float heading = 0;
float pitch = 0;
float roll = 0;
float cgHeight;
float carDamage[5];
int numberOfTyresOut = 0;
int pitLimiterOn = 0;
float abs = 0;
float kersCharge = 0;
float kersInput = 0;
int autoShifterOn = 0;
float rideHeight[2];
float turboBoost = 0;
float ballast = 0;
float airDensity = 0;
float airTemp = 0;
float roadTemp = 0;
float localAngularVel[3];
float finalFF = 0;
float performanceMeter = 0;
int engineBrake = 0;
int ersRecoveryLevel = 0;
int ersPowerLevel = 0;
int ersHeatCharging = 0;
int ersIsCharging = 0;
float kersCurrentKJ = 0;
int drsAvailable = 0;
int drsEnabled = 0;
float brakeTemp[4];
float clutch = 0;
float tyreTempI[4];
float tyreTempM[4];
float tyreTempO[4];
int isAIControlled;
float tyreContactPoint[4][3];
float tyreContactNormal[4][3];
float tyreContactHeading[4][3];
float brakeBias = 0;
float localVelocity[3];
int P2PActivations = 0;
int P2PStatus = 0;
int currentMaxRpm = 0;
float mz[4];
float fx[4];
float fy[4];
float slipRatio[4];
float slipAngle[4];
int tcinAction = 0;
int absInAction = 0;
float suspensionDamage[4];
float tyreTemp[4];
};
将数据发送到 python:
SPageFilePhysics* pfp = (SPageFilePhysics*)m_physics.mapFileBuffer;
send(connection, (char*)&pfp, sizeof(pfp), 0);
接收数据(蟒蛇(:
import socket, struct
#Variables
socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
physicsFormat = 'ifffiiffffffffffffffffffffiifffifffffffffiiiiifiifffffifffffiiifffffiiff'
socket.connect(("127.0.0.1", 42579))
print("--------------DATA--------------")
data = socket.recv(4096)
print(data)
print(struct.unpack(physicsFormat, data))
蟒蛇输出:
--------------DATA--------------
b'x00x00xb0/x9cx02x00x00'
Traceback (most recent call last):
File "c:/Users/lolamnma/Desktop/Telemtry Projects/OSIRIS_Telemetry/connect.py", line 14, in <module>
print(struct.unpack(physicsFormat, data))
struct.error: unpack requires a buffer of 288 bytes
我在这里的困惑是,打印出来的数据不应该不止于此吗?如果是这样,是因为它没有从游戏中接收数据,并且结构中的所有值均为 0。还有为什么我会收到缓冲区错误。抱歉,我通常不会在网站上提问,但我似乎找不到答案。任何帮助将不胜感激<3。
编辑: 很抱歉没有显示所有代码。它的作用的简要示例..
void initPhysics()
{
TCHAR szName[] = TEXT("Local\acpmf_physics");
m_physics.hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(SPageFilePhysics), szName);
if (!m_physics.hMapFile)
{
MessageBoxA(GetActiveWindow(), "CreateFileMapping failed", "ACCS", MB_OK);
}
m_physics.mapFileBuffer = (unsigned char*)MapViewOfFile(m_physics.hMapFile, FILE_MAP_READ, 0, 0, sizeof(SPageFilePhysics));
if (!m_physics.mapFileBuffer)
{
MessageBoxA(GetActiveWindow(), "MapViewOfFile failed", "ACCS", MB_OK);
}
}
老实说,我不太确定这个函数的作用。
m_physics.hMapFile = CreateFileMapping(INVALID_HANDLE_VALUE, NULL, PAGE_READWRITE, 0, sizeof(SPageFilePhysics), szName);
我假设上面的部分允许我查看我想从游戏中提取数据
的数据,这些数据存储在内存中调用此函数后,我的代码会创建一个套接字(我没有包括这一点,因为我认为您不需要看到它。它是一个服务器,所以它接受与我的python脚本的连接,并只发送数据:
send(connection, (char*)&pfp, sizeof(SPageFilePhysics), 0);
SPageFilePhysics* pfp = (SPageFilePhysics*)m_physics.mapFileBuffer;
这得到了数据,但同样我不太确定这也是做什么的。我所知道的是,它用游戏数据填充了结构。
问题出在:
send(connection, (char*)&pfp, sizeof(pfp), 0);
您正在计算指针大小而不是数据大小。并且您正在发送指针值。 将其替换为:
send(connection, pfp, sizeof(SPageFilePhysics), 0);
相关文章:
- 如何反转整数参数包
- 从不同线程使用int64的不同字节安全吗
- cmake如何在fedora工作站中找到boost静态库包
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- cmake在我的项目中所需的所有静态库都不成功
- 在UNIX系统中使用DIR查找文件的字节大小
- 如何将enable-if与模板参数和参数包一起使用
- 如何使用Crypto++并为RSA返回可打印的字节/字符数组
- std::当在256字节边界上写入整数时,流的奇怪行为
- 在没有Xcode的情况下在Mac捆绑包中嵌入框架
- 为什么这个音频包络不能通过开关的情况?
- struct.error:解压缩 C++ 结构时,解包需要 288 字节的缓冲区
- 配置和安装项目所需的包
- 获取C++模板参数包的总大小(以字节为单位)
- 计算表示有符号整数所需的最小字节数
- WideCharToMultiByte - Shift-JIS 代码页所需的大小和写入的字节数不同
- send() 函数返回的字节数比 C++ 所需的字节更多
- 什么可能导致数据包的字节顺序部分混乱?
- BOOST-ASIO async_read_some不返回包字节数
- 如何在visual studio 2010 C++中制作带有所需.dll和lib(opencv)文件的.exe文件包