提问者:小点点

struct.error:在解压缩C++结构时,解压缩需要288字节的缓冲区


首先,如果这个问题已经被问过并回答过,我很抱歉,但我认为我的情况与我一直试图找到的其他答案不同。 而且我对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;

这得到了数据,但我也不太确定这还能做什么。 我只知道它用游戏数据填充结构。


共1个答案

匿名用户

问题在于:

send(connection, (char*)&pfp, sizeof(pfp), 0);

您正在计算指针大小而不是数据大小。 并且您正在发送指针值。 代之以:

send(connection, pfp, sizeof(SPageFilePhysics), 0);

相关问题


MySQL Query : SELECT * FROM v9_ask_question WHERE 1=1 AND question regexp '(struct.error|解压缩|c++|结构|解压缩|288|字节|缓冲区)' ORDER BY qid DESC LIMIT 20
MySQL Error : Got error 'repetition-operator operand invalid' from regexp
MySQL Errno : 1139
Message : Got error 'repetition-operator operand invalid' from regexp
Need Help?