字节数组构造UDP数据包 [英] Byte Array to Struct UDP Packet

查看:48
本文介绍了字节数组构造UDP数据包的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我目前坚持我的项目.我目前从游戏中接收UDP数据包.这些数据包包含字节数组.这些字节数组需要转换为结构.

我已经解决了这个问题中的先前问题:

P.s.车上没有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-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-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是正常的).

我希望这是足够的信息.

解决方案

这里有几件事要看;首先是规范中的 [4] 等指的是这些东西的固定数量,而不是其中的一个-查看轮胎温度等;现在,您可以使用C#中的固定缓冲区执行此操作,但是使用它确实很痛苦,因为它需要 unsafe 代码,所以我改为刚刚使用了一些自定义四边形类型;我还明确列出了所有结构.而不是读取标题两次,这里我将其顺序解析为20个汽车实例.

结果:占所有字节;演示代码.

 使用系统;使用System.Runtime.CompilerServices;使用System.Runtime.InteropServices;[StructLayout(LayoutKind.Explicit,Pack = 0,Size = 23)]公共结构PacketHeader{[FieldOffset(0)]公共ushort m_packetFormat;//2019[FieldOffset(2)]公共字节m_gameMajorVersion;//游戏主要版本-"X.00"[FieldOffset(3)]公共字节m_gameMinorVersion;//游戏的次要版本-"1.XX"[FieldOffset(4)]公共字节m_packetVersion;//此数据包类型的版本,均从1开始[FieldOffset(5)]public PacketType m_packetId;//数据包类型的标识符,请参见下文[FieldOffset(6)]公共ulong m_sessionUID;//会话的唯一标识符[FieldOffset(14)]公众持股m_sessionTime;//会话时间戳[FieldOffset(18)]公共uint m_frameIdentifier;//检索到数据的帧的标识符[FieldOffset(22)]公共字节m_playerCarIndex;//数组中玩家汽车的索引};公共枚举PacketType:字节{运动= 0,//包含玩家汽车的所有运动数据–仅在玩家控制时发送会话= 1,//关于会话的数据–跟踪,剩余时间LapData = 2,//有关会话中汽车所有圈速的数据Event = 3,//会话期间发生的各种值得注意的事件参与者= 4,//会议参与者列表,主要与多人游戏相关CarSetups = 5,//详细说明比赛中赛车的赛车设置的数据包CarTelemetry = 6,//所有汽车的遥测数据CarStatus = 7//所有汽车的状态数据,例如损坏}[StructLayout(LayoutKind.Explicit,Pack = 0,Size = 63)]公共结构CarTelemetryData{[FieldOffset(0)]公共ushort m_speed;//车速,以每小时公里数为单位[FieldOffset(2)]公众持股m_throttle;//应用的节气门量(0.0到1.0)[FieldOffset(6)]公众持股m_steer;//转向(从-1.0(向左全锁)到1.0(向右全锁))[FieldOffset(10)]公众持股m_brake;//施加的制动量(0.0到1.0)[FieldOffset(14)]公共字节m_clutch;//施加的离合器数量(0到100)[FieldOffset(15)]公共字节数m_gear;//选择了档位(1-8,N = 0,R = -1)[FieldOffset(16)]公共ushort m_engineRPM;//引擎RPM[FieldOffset(18)]公共字节m_drs;//0 =关闭,1 =开启[FieldOffset(19)]公共字节m_revLightsPercent;//转向灯指示灯(百分比)[FieldOffset(20)]公共UInt16Quad m_brakesTemperature;//制动温度(摄氏度)[FieldOffset(28)]公共UInt16Quad m_tyresSurfaceTemperature;//轮胎表面温度(摄氏度)[FieldOffset(36)]公共UInt16Quad m_tyresInnerTemperature;//轮胎内部温度(摄氏度)[FieldOffset(44)]公共ushort m_engineTemperature;//发动机温度(摄氏度)[FieldOffset(46)]公共SingleQuad轮胎压力;//胎压(PSI)[FieldOffset(62)]公共ByteQuad m_surfaceType;//驱动面,请参见附录};[StructLayout(LayoutKind.Explicit,Pack = 0,Size = 8)]公共结构UInt16Quad{[FieldOffset(0)]公共超短A;[FieldOffset(2)]公共超短B;[FieldOffset(6)]公共Ushort C;[FieldOffset(6)]公共超短D;}[StructLayout(LayoutKind.Explicit,Pack = 0,Size = 16)]公共结构SingleQuad{[FieldOffset(0)]公众持股量A;[FieldOffset(4)]公众持股B;[FieldOffset(8)]公众持股C;[FieldOffset(12)]公众持股D;}[StructLayout(LayoutKind.Explicit,Pack = 0,Size = 4)]公共结构ByteQuad{[FieldOffset(0)]公用字节A;[FieldOffset(1)]公共字节B;[FieldOffset(2)]公用字节C;[FieldOffset(3)]公共字节D;}静态P级{静态void Main(){Console.WriteLine(Unsafe.SizeOf< PacketHeader>());Console.WriteLine(Unsafe.SizeOf< CarTelemetryData>());Console.WriteLine(bytes.Length);ReadOnlySpan< byte>剩余=字节;var header = MemoryMarshal.Cast< byte,PacketHeader>(剩余)[0];剩余=剩余.Slice(Unsafe.SizeOf< PacketHeader>());Console.WriteLine($"{header.m_packetFormat} {header.m_gameMajorVersion},{header.m_gameMinorVersion}:{header.m_packetId}");开关(header.m_packetId){案例PacketType.CarTelemetry://我们期望有20 * CarTelemetryData,然后是一个按钮//注意*我们可以*为此使用固定的缓冲区,但是...这真的非常//难以配合;让我们尝试一下int carIndex = 0;foreach(MemoryMarshal.Cast字节,CarTelemetryData>(剩余).Slice(0,20)中的可变遥测){Console.WriteLine($"car:{carIndex},速度:{telemetry.m_speed},油门:{telemetry.m_throttle}");var temps = telemetry.m_tyresInnerTemperature;Console.WriteLine($输入temps:{temps.A}/{temps.B}/{temps.C}/{temps.D}");}剩余=剩余.Slice(20 * Unsafe.SizeOf< CarTelemetryData>());var按钮= MemoryMarshal.Cast< byte,uint>(剩余)[0];Console.WriteLine($"Buttons:{buttons}");剩余=剩余.Slice(sizeof(uint));Console.WriteLine($无法说明:{remaining.Length}");休息;}}静态只读字节[]字节=新字节[] {0xE3、0x07、0x01、0x15、0x01、0x06、0xF8、0xCE,0xBE,0x09、0x64、0x7F,0xEA,0xD1、0xDC,0xA1、0x16、0x41、0x91、0x01、0x00、0x00、0x13、0x000x00、0x00、0x80、0x3F,0x36、0x53、0x7E,0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0xF3、0x2F,0x00、0x64、0x1D,0x00、0x1D,0x00、0x00、0x00、0x00D0x00、0x74、0x00、0x74、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x410xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x74、0x00、0x00、0x00、0x80、0x3F,0x1B,0xF2、0x3C0x00、0x00、0x00、0x00、0x02、0x35、0x2D,0x00、0x22、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x69、0x00、0x69、0x00、0x4F,0x00F0x5A,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x000x41、0x00、0x00、0x00、0x00、0x7B,0x00、0x00、0x00、0x80、0x3F,0xF3、0x59、0xA1、0xBA,0x00、0x00,0x00、0x00、0x00、0x02、0x59、0x2F,0x00、0x64、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x72、0x00、0x72、0x00、0x4F,0x00、0x4、0x00,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00,,0x00、0x00、0x00、0x00、0x77、0x00、0x00、0x00、0x80、0x3F,0xFE,0x5F,0x3F,0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0x3D,0x2E,0x3E,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x71、0x00、0x71、0x00、0x4F,0x00、0x4F,0x00、0x5A,0x00、0x5A,0x00、0x58、0x00、0x5、0x00、0x58、0x00,0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x81、0x00、0x00、0x00、0x00,0x3F,0x89、0x78、0x23、0x3C,0x00、0x00、0x00、0x00、0x00、0x03、0xE0、0x28、0x00、0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x78、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x77、0x00、0x00、0x00、0x00、0x000x3F,0xC3、0x73、0x98、0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0x2F,0x2E,0x00、0x54、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D0x75、0x00、0x50、0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0x00、0xAC,0x000x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x76、0x00、0x00、0x00、0x80、0x3F,0xF3、0xF4、0xBA,0xBA,0x00、0x00、0x00、0x000x00、0x02、0x21、0x2E,0x00、0x59、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x75、0x00、0x75、0x00、0x4F,0x00、0x4F,0x00、0x00、0xB0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x000x00、0x00、0x7C,0x00、0x00、0x00、0x80、0x3F,0x4D,0x7D,0x04、0x3B,0x00、0x00、0x00、0x00、0x00,0x02、0xFB,0x2F,0x00、0x64、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x70、0x00、0x70、0x00、0x4F,0x00、0x4F,0x00、0x5A,0x5A,0x5A0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x00、0x000x00、0x75、0x00、0x00、0x00、0x80、0x3F,0x84、0x45、0xAB,0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0xBF,0x2D,0x00、0x31、0x1D,0x00、0x000x1D,0x00、0x1D,0x00、0x77、0x00、0x77、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x000x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x80、0x00、0x00、0x00、0x80、0x3F,0xB0xBD,0x3B,0x00、0x00、0x00、0x00、0x00、0x03、0x1B,0x28、0x00、0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x71、0x00、0x00、0x00、0x00、0x000x00、0x4F,0x00、0x5A,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41,0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x72、0x00、0x00、0x00、0x80、0x3F,0xF8、0xF8,0x3A,0x00、0x00、0x00、0x00、0x00、0x02、0x63、0x2C,0x00、0x37、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x79、0x00、0x79、0x00、0x79、0x00,0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0x00、0xB8,0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x7B,0x00、0x00、0x00、0x80、0x3F,0xFF,0xA7、0x60、0x3A,0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00,0x00、0x64、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x6E,0x00、0x6E,0x00、0x4F,0x00、0x4F,0x00、0x5A,0x00、0x5A,0x58、0x58、0x58,0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x00、0x00、0x00,0x00、0x00、0x80、0x3F,0xB9、0x2E,0x2F,0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0xD1、0x2F,0x00、0x64、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x75、0x00、0x75、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x000x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x00、0x00、0x000x00、0x00、0x80、0x3F,0xCD,0x1E,0x18、0x3A,0x00、0x00、0x00、0x00、0x00、0x02、0x3F,0x2D,0x00、0x23、0x1D,0x00、0x1D,0x00、0x00、0x00、0x000x00、0x6F,0x00、0x6F,0x00、0x4F,0x00、0x4F,0x00、0x5A,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0x00、0xAC,0x410xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x73、0x00、0x00、0x00、0x80、0x3F,0x15、0x0F,0xAF,0xAF0x00、0x00、0x00、0x00、0x02、0xA5、0x2B,0x00、0x0C,0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x70、0x00、0x70、0x00、0x00、0x4F,0x4F0x5A,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x7A,0x00、0x00、0x00、0x80、0x3F,0x2B,0xC0、0x14、0x30x00、0x00、0x00、0x02、0x49、0x2F,0x00、0x64、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x6F,0x00、0x6F,0x00、0x4F,0x00、0x00、0x000x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x000x00、0x00、0x00、0x00、0x7F,0x00、0x00、0x00、0x80、0x3F,0x41、0xCA,0xC0、0x3C,0x00、0x00、0x00、0x00、0x00、0x03、0x85、0x2B,0x00、0x000x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x79、0x00、0x79、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x5、0x50x00、0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x72、0x00、0x00、0x00、0x00、0x000x3F,0x07、0x1F,0xD5、0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0xDE,0x2A,0x00、0x00、0x1D,0x00,0x1D,0x00、0x1D,0x00、0x1D,0x00、0x78、0x00、0x78、0x00、0x4F,0x00、0x4F,0x00、0x5B,0x00、0x5B,0x00、0x58、0x00、0x58、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00,0x00、0xAC,0x41、0x00、0x00、0xAC,0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x71、0x00、0x00、0x00、0x00、0x00,0xDD,0xC0、0x1C,0x3C,0x00、0x00、0x00、0x00、0x00、0x02、0xDD,0x2A,0x00、0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、6x0,0x00、0x4F,0x00、0x4F,0x00、0x5A,0x00、0x5A,0x00、0x58、0x00、0x58、0x00、0x5A,0x00、0x00、0x00、0xAC,0x41、0x00、0x00、0x00、0xAC,0x41,0xB8、0x41、0x00、0x00、0xB8、0x41、0x00、0x00、0x00、0x00、0x31、0x00、0x97、0x96、0x96、0x3E,0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00,0x01、0x9B,0x17、0x00、0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x1D,0x00、0x62、0x00、0x62、0x00、0x4F,0x00、0x4F,0x00、0x59、0x00、0x59,0x58、0x00、0x58、0x00、0x5A,0x00、0xCD,0xCC,0xA8、0x41、0xCD,0xCC,0xA8、0x41、0x33、0x33、0xBB,0x41、0x33、0x33、0xBB,0x41、0x00、0x00、0x00、0x00、0x00、0x00、0x00、0x00};} 

I am currently stuck with my project. I currently recieve UDP packets from a game. These packets contain byte arrays. These byte arrays need to be converted to a struct.

I've tackled a previous problem in this question: F1 2019 UDP decoding

I have got some part of this to work. I use this code to convert the byte array in to a struct:

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;
            }

My Packet Header (Struct) Looks like this:

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
    };

Through this code I get the correct information. So this works!

The game sends multiple "Packets" (Structs) through the same byte array.

But when I use the same code to convert the byte array to the new structlayout I don't get the right information out of the array. Example:

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;

This code uses this structlayout:

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
    };

In the struct above there are other structs stored:

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
    };

So my problem now is that when I use this code to convert the byte array to this specific struct I don't get the information I want.

P.s. There are no 36 gears in the car and my brakes are not 21760 degree celcius...

Does anyone have a suggestion?

With kind regards,

Edit:

For more information, this is the hex code I get when I want to read the packet 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

I know that with this information the following numbers don't match with what is happening in the game:

The current gear should be: 1. That is one fact I know.

The reflight percentage should be under 100%

The temps should be a lot lower,

The RPM is way to high (Probbably around 10000 is normal).

I hope this is information will suffice.

解决方案

Here we go; there were a few things to look at here; the first is that the [4] etc in the specification refers to a fixed quantity of those things, not one of them - look at the tyre temperatures, etc; now, you can do this with a fixed buffer in C#, but that is really painful to use as it requires unsafe code, so instead I've just used some custom quad types; I've also explicitly laid out all the structs. Rather than read the header twice, here I'm parsing it sequentially as 20 car instances.

Result: all bytes accounted for; demo code.

using System;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;

[StructLayout(LayoutKind.Explicit, Pack = 0, Size = 23)]
public struct PacketHeader
{
    [FieldOffset(0)]
    public ushort m_packetFormat;         // 2019
    [FieldOffset(2)]
    public byte m_gameMajorVersion;     // Game major version - "X.00"
    [FieldOffset(3)]
    public byte m_gameMinorVersion;     // Game minor version - "1.XX"
    [FieldOffset(4)]
    public byte m_packetVersion;        // Version of this packet type, all start from 1
    [FieldOffset(5)]
    public PacketType m_packetId;             // Identifier for the packet type, see below
    [FieldOffset(6)]
    public ulong m_sessionUID;           // Unique identifier for the session
    [FieldOffset(14)]
    public float m_sessionTime;          // Session timestamp
    [FieldOffset(18)]
    public uint m_frameIdentifier;      // Identifier for the frame the data was retrieved on
    [FieldOffset(22)]
    public byte m_playerCarIndex;       // Index of player's car in the array
};

public enum PacketType : byte
{
    Motion = 0, // Contains all motion data for player’s car – only sent while player is in control

    Session = 1,// Data about the session – track, time left

    LapData = 2,//  Data about all the lap times of cars in the session

    Event = 3, // Various notable events that happen during a session

    Participants = 4, // List of participants in the session, mostly relevant for multiplayer

    CarSetups = 5, // Packet detailing car setups for cars in the race

    CarTelemetry = 6,  // Telemetry data for all cars

    CarStatus = 7 //  Status data for all cars such as damage
}

[StructLayout(LayoutKind.Explicit, Pack = 0, Size = 63)]
public struct CarTelemetryData
{
    [FieldOffset(0)]
    public ushort m_speed;                    // Speed of car in kilometres per hour
    [FieldOffset(2)]
    public float m_throttle;                 // Amount of throttle applied (0.0 to 1.0)
    [FieldOffset(6)]
    public float m_steer;                    // Steering (-1.0 (full lock left) to 1.0 (full lock right))
    [FieldOffset(10)]
    public float m_brake;                    // Amount of brake applied (0.0 to 1.0)
    [FieldOffset(14)]
    public byte m_clutch;                   // Amount of clutch applied (0 to 100)
    [FieldOffset(15)]
    public sbyte m_gear;                     // Gear selected (1-8, N=0, R=-1)
    [FieldOffset(16)]
    public ushort m_engineRPM;                // Engine RPM
    [FieldOffset(18)]
    public byte m_drs;                      // 0 = off, 1 = on
    [FieldOffset(19)]
    public byte m_revLightsPercent;         // Rev lights indicator (percentage)
    [FieldOffset(20)]
    public UInt16Quad m_brakesTemperature;     // Brakes temperature (celsius)
    [FieldOffset(28)]
    public UInt16Quad m_tyresSurfaceTemperature; // Tyres surface temperature (celsius)
    [FieldOffset(36)]
    public UInt16Quad m_tyresInnerTemperature; // Tyres inner temperature (celsius)
    [FieldOffset(44)]
    public ushort m_engineTemperature;        // Engine temperature (celsius)
    [FieldOffset(46)]
    public SingleQuad tyresPressure;         // Tyres pressure (PSI)
    [FieldOffset(62)]
    public ByteQuad m_surfaceType;           // Driving surface, see appendice
};
[StructLayout(LayoutKind.Explicit, Pack = 0, Size = 8)]
public struct UInt16Quad
{
    [FieldOffset(0)]
    public ushort A;
    [FieldOffset(2)]
    public ushort B;
    [FieldOffset(6)]
    public ushort C;
    [FieldOffset(6)]
    public ushort D;
}
[StructLayout(LayoutKind.Explicit, Pack = 0, Size = 16)]
public struct SingleQuad
{
    [FieldOffset(0)]
    public float A;
    [FieldOffset(4)]
    public float B;
    [FieldOffset(8)]
    public float C;
    [FieldOffset(12)]
    public float D;
}
[StructLayout(LayoutKind.Explicit, Pack = 0, Size = 4)]
public struct ByteQuad
{
    [FieldOffset(0)]
    public byte A;
    [FieldOffset(1)]
    public byte B;
    [FieldOffset(2)]
    public byte C;
    [FieldOffset(3)]
    public byte D;
}
static class P
{
    static void Main()
    {
        Console.WriteLine(Unsafe.SizeOf<PacketHeader>());
        Console.WriteLine(Unsafe.SizeOf<CarTelemetryData>());
        Console.WriteLine(bytes.Length);
        ReadOnlySpan<byte> remaining = bytes;
        var header = MemoryMarshal.Cast<byte, PacketHeader>(remaining)[0];
        remaining = remaining.Slice(Unsafe.SizeOf<PacketHeader>());
        Console.WriteLine($"{header.m_packetFormat} {header.m_gameMajorVersion}, {header.m_gameMinorVersion}: {header.m_packetId}");
        switch (header.m_packetId)
        {
            case PacketType.CarTelemetry:
                // we expect 20*CarTelemetryData, then a uint of the buttons
                // note we *could* use a fixed buffer for this, but... that's really very
                // awkward to work with; let's try this instead
                int carIndex = 0;
                foreach (var telemetry in MemoryMarshal.Cast<byte, CarTelemetryData>(remaining).Slice(0, 20))
                {
                    Console.WriteLine($"car: {carIndex}, speed: {telemetry.m_speed}, throttle: {telemetry.m_throttle}");
                    var temps = telemetry.m_tyresInnerTemperature;
                    Console.WriteLine($"  type temps: {temps.A}/{temps.B}/{temps.C}/{temps.D}");
                }
                remaining = remaining.Slice(20 * Unsafe.SizeOf<CarTelemetryData>());
                var buttons = MemoryMarshal.Cast<byte, uint>(remaining)[0];
                Console.WriteLine($"Buttons: {buttons}");
                remaining = remaining.Slice(sizeof(uint));
                Console.WriteLine($"Unaccounted for: {remaining.Length}");
                break;
        }

    }

    static readonly byte[] bytes = new byte[] {
        0xE3, 0x07, 0x01, 0x15, 0x01, 0x06, 0xF8, 0xCE, 0xBE, 0x09, 0x64, 0x7F, 0xEA, 0xD1, 0xDC, 0xA1, 0x16, 0x41, 0x91, 0x01, 0x00, 0x00, 0x13, 0x7B, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x36, 0x53, 0x7E, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xF3, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x74, 0x00, 0x74, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x1B, 0xF2, 0x3A, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x35, 0x2D, 0x00, 0x22, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x69, 0x00, 0x69, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF3, 0x59, 0xA1, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x59, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x72, 0x00, 0x72, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xFE, 0x5F, 0x3F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3D, 0x2E, 0x00, 0x3E, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x81, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x89, 0x78, 0x23, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0xE0, 0x28, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x77, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xC3, 0x73, 0x98, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x2F, 0x2E, 0x00, 0x54, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x75, 0x00, 0x75, 0x00, 0x50, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x76, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF3, 0xF4, 0xBA, 0xBA, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x21, 0x2E, 0x00, 0x59, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x75, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7C, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x4D, 0x7D, 0x04, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xFB, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x70, 0x00, 0x70, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x75, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x84, 0x45, 0xAB, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xBF, 0x2D, 0x00, 0x31, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x77, 0x00, 0x77, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xB5, 0x8C, 0xBD, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x1B, 0x28, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x71, 0x00, 0x71, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xF8, 0xD0, 0x87, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x63, 0x2C, 0x00, 0x37, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x79, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7B, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xFF, 0xA7, 0x60, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xDE, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x6E, 0x00, 0x6E, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xB9, 0x2E, 0x2F, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xD1, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x75, 0x00, 0x75, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x74, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xCD, 0x1E, 0x18, 0x3A, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x3F, 0x2D, 0x00, 0x23, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x73, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x15, 0x0F, 0xAF, 0x3B, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xA5, 0x2B, 0x00, 0x0C, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x70, 0x00, 0x70, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7A, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x2B, 0xC0, 0x14, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x49, 0x2F, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x7F, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x41, 0xCA, 0xC0, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x03, 0x85, 0x2B, 0x00, 0x64, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x79, 0x00, 0x79, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x72, 0x00, 0x00, 0x00, 0x80, 0x3F, 0x07, 0x1F, 0xD5, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xDE, 0x2A, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x78, 0x00, 0x78, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5B, 0x00, 0x5B, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x71, 0x00, 0x00, 0x00, 0x80, 0x3F, 0xDD, 0xC0, 0x1C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xDD, 0x2A, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x6F, 0x00, 0x6F, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x5A, 0x00, 0x5A, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xAC, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0xB8, 0x41, 0x00, 0x00, 0x00, 0x00, 0x31, 0x00, 0x97, 0x96, 0x96, 0x3E, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x9B, 0x17, 0x00, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x1D, 0x00, 0x62, 0x00, 0x62, 0x00, 0x4F, 0x00, 0x4F, 0x00, 0x59, 0x00, 0x59, 0x00, 0x58, 0x00, 0x58, 0x00, 0x5A, 0x00, 0xCD, 0xCC, 0xA8, 0x41, 0xCD, 0xCC, 0xA8, 0x41, 0x33, 0x33, 0xBB, 0x41, 0x33, 0x33, 0xBB, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00};
}

这篇关于字节数组构造UDP数据包的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆