【发布时间】:2020-06-06 16:51:46
【问题描述】:
我目前正忙于我的项目。我目前从游戏中接收 UDP 数据包。这些数据包包含字节数组。这些字节数组需要转换为结构体。
我已经解决了这个问题的前一个问题: F1 2019 UDP decoding
我已经完成了其中的一部分工作。我使用此代码将字节数组转换为结构:
PacketHeader ByteArrayToPacketHeader(byte[] bytes)
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
PacketHeader stuff;
try
{
stuff = (PacketHeader)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PacketHeader));
}
finally
{
handle.Free();
}
return stuff;
}
我的数据包头(结构)看起来像这样:
public struct PacketHeader
{
public ushort m_packetFormat; // 2019
public byte m_gameMajorVersion; // Game major version - "X.00"
public byte m_gameMinorVersion; // Game minor version - "1.XX"
public byte m_packetVersion; // Version of this packet type, all start from 1
public byte m_packetId; // Identifier for the packet type, see below
public ulong m_sessionUID; // Unique identifier for the session
public float m_sessionTime; // Session timestamp
public uint m_frameIdentifier; // Identifier for the frame the data was retrieved on
public byte m_playerCarIndex; // Index of player's car in the array
};
通过这段代码,我得到了正确的信息。所以这行得通!
游戏通过同一个字节数组发送多个“包”(Structs)。
但是当我使用相同的代码将字节数组转换为新的结构布局时,我没有从数组中得到正确的信息。 示例:
PacketCarTelemetryData ByteArrayToPacketCarTelemetryData(byte[] bytes)
{
GCHandle handle = GCHandle.Alloc(bytes, GCHandleType.Pinned);
PacketCarTelemetryData stuff;
try
{
stuff = (PacketCarTelemetryData)Marshal.PtrToStructure(handle.AddrOfPinnedObject(), typeof(PacketCarTelemetryData));
}
finally
{
handle.Free();
}
return stuff;
此代码使用此结构布局:
public struct PacketCarTelemetryData
{
public PacketHeader m_header; // Header
public CarTelemetryData m_carTelemetryData;
public uint m_buttonStatus; // Bit flags specifying which buttons are being pressed
// currently - see appendices
};
在上面的结构中还存储了其他结构:
public struct CarTelemetryData
{
public ushort m_speed; // Speed of car in kilometres per hour
public float m_throttle; // Amount of throttle applied (0.0 to 1.0)
public float m_steer; // Steering (-1.0 (full lock left) to 1.0 (full lock right))
public float m_brake; // Amount of brake applied (0.0 to 1.0)
public byte m_clutch; // Amount of clutch applied (0 to 100)
public sbyte m_gear; // Gear selected (1-8, N=0, R=-1)
public ushort m_engineRPM; // Engine RPM
public byte m_drs; // 0 = off, 1 = on
public byte m_revLightsPercent; // Rev lights indicator (percentage)
public ushort m_brakesTemperature; // Brakes temperature (celsius)
public ushort m_tyresSurfaceTemperature; // Tyres surface temperature (celsius)
public ushort m_tyresInnerTemperature; // Tyres inner temperature (celsius)
public ushort m_engineTemperature; // Engine temperature (celsius)
public float tyresPressure; // Tyres pressure (PSI)
public byte m_surfaceType; // Driving surface, see appendice
};
所以我现在的问题是,当我使用此代码将字节数组转换为此特定结构时,我没有得到我想要的信息。
附:车里没有36档,我的刹车也不是21760摄氏度……
有人有什么建议吗?
致以诚挚的问候,
编辑:
有关更多信息,这是我想读取数据包 CarTelemetryData 时得到的十六进制代码:
E3-07-01-15-01-06-F8-CE-BE-09-64-7F-EA-D1-DC-A1-16-41-91-01-00-00-13-7B-00-00-00-80-3F-36-53-7E-3C-00-00-00-00-00-02-F3-2F-00-64-1D-00-1D-00-1D-00-1D-00-74-00-74-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-74-00-00-00-80-3F-1B-F2-3A-3C-00-00-00-00-00-02-35-2D-00-22-1D-00-1D-00-1D-00-1D-00-69-00-69-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7B-00-00-00-80-3F-F3-59-A1-BA-00-00-00-00-00-02-59-2F-00-64-1D-00-1D-00-1D-00-1D-00-72-00-72-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-77-00-00-00-80-3F-FE-5F-3F-3C-00-00-00-00-00-02-3D-2E-00-3E-1D-00-1D-00-1D-00-1D-00-71-00-71-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-81-00-00-00-80-3F-89-78-23-3C-00-00-00-00-00-03-E0-28-00-00-1D-00-1D-00-1D-00-1D-00-77-00-78-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-77-00-00-00-80-3F-C3-73-98-3C-00-00-00-00-00-02-2F-2E-00-54-1D-00-1D-00-1D-00-1D-00-75-00-75-00-50-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-76-00-00-00-80-3F-F3-F4-BA-BA-00-00-00-00-00-02-21-2E-00-59-1D-00-1D-00-1D-00-1D-00-75-00-75-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7C-00-00-00-80-3F-4D-7D-04-3B-00-00-00-00-00-02-FB-2F-00-64-1D-00-1D-00-1D-00-1D-00-70-00-70-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-75-00-00-00-80-3F-84-45-AB-3C-00-00-00-00-00-02-BF-2D-00-31-1D-00-1D-00-1D-00-1D-00-77-00-77-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-80-00-00-00-80-3F-B5-8C-BD-3B-00-00-00-00-00-03-1B-28-00-00-1D-00-1D-00-1D-00-1D-00-71-00-71-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-72-00-00-00-80-3F-F8-D0-87-3A-00-00-00-00-00-02-63-2C-00-37-1D-00-1D-00-1D-00-1D-00-79-00-79-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7B-00-00-00-80-3F-FF-A7-60-3A-00-00-00-00-00-02-DE-2F-00-64-1D-00-1D-00-1D-00-1D-00-6E-00-6E-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7A-00-00-00-80-3F-B9-2E-2F-3C-00-00-00-00-00-02-D1-2F-00-64-1D-00-1D-00-1D-00-1D-00-75-00-75-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-74-00-00-00-80-3F-CD-1E-18-3A-00-00-00-00-00-02-3F-2D-00-23-1D-00-1D-00-1D-00-1D-00-6F-00-6F-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-73-00-00-00-80-3F-15-0F-AF-3B-00-00-00-00-00-02-A5-2B-00-0C-1D-00-1D-00-1D-00-1D-00-70-00-70-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7A-00-00-00-80-3F-2B-C0-14-3C-00-00-00-00-00-02-49-2F-00-64-1D-00-1D-00-1D-00-1D-00-6F-00-6F-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-7F-00-00-00-80-3F-41-CA-C0-3C-00-00-00-00-00-03-85-2B-00-64-1D-00-1D-00-1D-00-1D-00-79-00-79-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-72-00-00-00-80-3F-07-1F-D5-3C-00-00-00-00-00-02-DE-2A-00-00-1D-00-1D-00-1D-00-1D-00-78-00-78-00-4F-00-4F-00-5B-00-5B-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-71-00-00-00-80-3F-DD-C0-1C-3C-00-00-00-00-00-02-DD-2A-00-00-1D-00-1D-00-1D-00-1D-00-6F-00-6F-00-4F-00-4F-00-5A-00-5A-00-58-00-58-00-5A-00-00-00-AC-41-00-00-AC-41-00-00-B8-41-00-00-B8-41-00-00-00-00-31-00-97-96-96-3E-00-00-00-00-00-00-00-00-00-01-9B-17-00-00-1D-00-1D-00-1D-00-1D-00-62-00-62-00-4F-00-4F-00-59-00-59-00-58-00-58-00-5A-00-CD-CC-A8-41-CD-CC-A8-41-33-33-BB-41-33-33-BB-41-00-00-00-00-00-00-00-00
我知道根据这些信息,以下数字与游戏中发生的情况不符:
当前档位应该是: 1. 这是我知道的一个事实。
重飞百分比应低于 100%
温度应该低很多,
RPM 太高了(可能在 10000 左右是正常的)。
我希望这些信息就足够了。
【问题讨论】:
-
数据的字节序是什么?你是如何序列化这些数据的?是相反的相同代码吗?基本上,我担心填充; PacketHeader 的大小是 32,但您可能期望 23 还是什么?对吗?
-
@MarcGravell 感谢您的快速回复!我所知道的是他们在 LittleEndian 中解码数组。我知道这意味着什么,但不知道如何处理它。我也不知道序列化是什么。我对此有点陌生...如果您不介意我想了解更多信息,因此如果您可以稍微解释一下或将我引导到可以了解它的某个网页,我会真的很感激。亲切的问候,
-
很多桌面 CPU 也是 little-endian,所以:它可以工作吗?你有一个我可以在这里查看的示例有效负载,十六进制和预期值。碰巧,这是我的专业领域。
-
@MarcGravell 我会尽快将十六进制发送给您,但我不明白预期值。我只是得到一大行十六进制代码,所有信息都存储在那里。至于你在下面的回答,我已经让 packetheader 工作了,但其余的都没有。
-
我很乐意帮助您尝试解决这个问题,但是:这是 1347 字节 - 这是什么意思?一个标头和一个遥测?大量的标题和遥测一个接一个?一个标题和很多遥测?它对于每个人来说都太大了...帮助我了解我在这里看到的内容