gpt4 book ai didi

python - struct.error : unpack requires a buffer of 288 bytes when unpacking c++ structure

转载 作者:行者123 更新时间:2023-12-02 10:00:32 30 4
gpt4 key购买 nike

首先,很抱歉是否已经提出并回答了这个问题,但我认为我的情况与我一直试图找到的其他答案有所不同。另外,我对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);
接收数据(Python):
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))

Python输出:
--------------DATA--------------
b'\x00\x00\xb0/\x9c\x02\x00\x00'
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);

关于python - struct.error : unpack requires a buffer of 288 bytes when unpacking c++ structure,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62715611/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com