魔兽争霸III数据包规范
字节 / 类型
|
用途
|
1 / uint8
|
魔数标志位。
0xF7 – 局域网UDP或游戏中TCP数据包(本文中所有数据包都采用这个标志)
0xFF -- Battle.net战网数据包
|
1 / uint8
|
操作码。详情参考第3、4、5部分。
|
2 / uint16
|
数据包长度(包括4字节的包头部分)。
|
字节 / 类型
|
用途
|
4 / uint32
|
以低位在前的方式表示游戏类型。
'W3XP' = TFT 'WAR3' = ROC
|
4 / uint32
|
游戏版本。
比如War3 1.24,这里就填24。
|
4 / uint32
|
游戏ID, 广播时置零。
|
字节 / 类型
|
用途
|
4 / uint32
|
以低位在前的方式表示操作系统信息。
'IX86' = Windows 'XMAC' = Mac OS X
|
4 / uint32
|
以低位在前的方式表示游戏类型。
|
4 / uint32
|
游戏ID。
|
4 / uint32
|
系统时钟(比如Windows就用GetTickCount()来获得)。
|
N/以'\0'结束的字符串
|
这是一个经过编码的字符串,包含着大量重要的游戏信息。参考附注。
|
4 / uint32
|
玩家位置数。
|
4 / uint32
|
游戏标志。据我所知 0x01 = 剧情游戏;0x09 = 自定义游戏。
|
4 / uint32
|
游戏内玩家数。
|
4 / uint32
|
非电脑玩家位置数。
综上所述,我们可以得出这样的公式:显示的游戏内玩家数=游戏内玩家数+(位置数-非电脑位置数)
|
4 / uint32
|
未知。通常是0-0x80
|
2 / uint16
|
以低位在前方式表示用于侦听连接的TCP游戏端口。
|
字节 / 类型
|
用途
|
4 / uint32
|
游戏设置。
|
1 / uint8
|
永远为0。
|
2 / uint16
|
地图宽度。
|
2 / uint16
|
地图高度。
|
4 / uint32
|
地图本地校验码。
|
N/以'\0'结束的字符串
|
地图名。
|
N/以'\0'结束的字符串
|
主机用户名。
|
1 / uint8
|
永远为0(也算个以'\0'结束的字符串?)
|
20 / uint8[20]
|
地图本地SHA-1哈希值,这一段是1.23版后添加的,以防止地图互通。
|
字节 / 类型
|
用途
|
4 / uint32
|
以低位在前的方式表示游戏类型。
|
4 / uint32
|
游戏版本。
|
4 / uint32
|
游戏ID(初始为1,随着逐个游戏的创建而自增)。
|
字节 / 类型
|
用途
|
4 / uint32
|
游戏ID。
|
4 / uint32
|
显示的游戏内玩家数。
|
4 / uint32
|
玩家位置总数。
|
字节 / 类型
|
用途
|
4 / uint32
|
游戏ID
|
字节 / 类型
|
用途
|
4 / uint32
|
系统时钟(比如Windows就用GetTickCount()来获得)。
|
字节 / 类型
|
用途
|
2 / uint16
|
接下去5段信息的总长度(到“开始位置数”为止,不包括本段的2个字节。)
|
1 / uint8
|
玩家位记录的条数,这里记为RN。
|
9 * RN / 玩家位记录 * RN
|
每条玩家位记录代表每个玩家位的详细信息。每条记录的结构如下:
uint8 玩家ID。0为电脑,0xFF为空。
uint8 地图下载进度。0-100,0xFF代表'?'。
uint8 玩家位状态。0-空,1-关闭,2-已有玩家。
uint8 是否电脑。0-活人,1-电脑。
uint8 队伍。0-11,12代表ob/裁判。
uint8 颜色。0-11,12代表ob/裁判。
uint8 种族。
0x01-人类,0x02-兽人,
0x04-暗夜精灵,0x08-亡灵,
0x20-随机,0x40-地图未指定。
uint8 AI等级。0-简单,1-普通,2-疯狂
uint8 生命百分比。
通常为50,60,70,80,90,100。用GHost++可设为其他值。
|
4 / uint32
|
游戏的初始随机种子。
|
1 / uint8
|
队伍和种族锁定标记:
0x01 – 队伍已锁定
0x02 – 种族已锁定
0x04 – 种族为随机(无法与0x02共用)
|
1 / uint8
|
地图开始位置数。
|
1 / uint8
|
为新加入玩家分配的玩家位。
|
16 / sockaddr_in
|
主机用getpeername()获得的目标玩家地址。
|
字节 / 类型
|
用途
|
4 / uint32
|
始终为0x02,可能是sockaddr_in的结尾数字?
|
1 / uint8
|
在玩家位信息中显示的玩家ID。
|
N/以'\0'结束的字符串
|
玩家名。最长16字节(包括结尾的'\0')。
|
1 / uint8
|
后续的额外字节数。局域网游戏中总是1。
|
N / uint8[N]
|
额外字节。局域网游戏中总是一个\0字节。
|
16 / sockaddr_in
|
从getpeername()获得的该玩家地址。
|
16 / sockaddr_in
|
从NAT路由(如果有)获得的该玩家地址(似乎只用于Battle.net战网)。
|
字节 / 类型
|
用途
|
1 / uint8
|
玩家ID。
|
4 / uint32
|
离开原因标志。这部分还需进一步研究。
|
字节 / 类型
|
用途
|
1 / uint8
|
玩家ID。
|
字节 / 类型
|
用途
|
2 / uint16
|
接下去5段信息的总长度(到“开始位置数”为止,不包括本段的2个字节。)
|
1 / uint8
|
玩家位记录的条数,这里记为RN。
|
9 * RN / 玩家位记录 * RN
|
每条玩家位记录代表每个玩家位的详细信息。每条记录的结构如下:
uint8 玩家ID。0为电脑,0xFF为空。
uint8 地图下载进度。0-100,0xFF代表'?'。
uint8 玩家位状态。0-空,1-关闭,2-已有玩家。
uint8 是否电脑。0-活人,1-电脑。
uint8 队伍。0-11,12代表ob/裁判。
uint8 颜色。0-11,12代表ob/裁判。
uint8 种族。
0x01-人类,0x02-兽人,
0x04-暗夜精灵,0x08-亡灵,
0x20-随机,0x40-地图未指定。
uint8 AI等级。0-简单,1-普通,2-疯狂
uint8 生命百分比。
通常为50,60,70,80,90,100。用GHost++可设为其他值。
|
4 / uint32
|
游戏的初始随机种子。
|
1 / uint8
|
队伍和种族锁定标记:
0x01 – 队伍已锁定
0x02 – 种族已锁定
0x04 – 种族为随机(无法与0x02共用)
|
1 / uint8
|
地图开始位置数。
|
字节 / 类型
|
用途
|
1 / uint8
|
需发送聊天信息的目标玩家数,这里记为PN
|
PN / uint8 * PN
|
每个uint8保存一个目标玩家ID。
|
1 / uint8
|
聊天信息发送者的玩家ID
|
1 / uint8
|
聊天信息标志。
0x10-准备阶段,0x20-游戏阶段
|
4 / uint32
|
发送目标标志。
0x00 – 向所有玩家发送
0x01 – 向盟友发送
0x02 – 向OB/裁判发送
0x03-0x0E – 向特定玩家发送(玩家ID=值-2)
当聊天信息标志为0x10(即游戏准备阶段)时,这段信息将被排除。
|
N/以'\0'结束的字符串
|
聊天字符串。
|
字节 / 类型
|
用途
|
4 / uint32
|
游戏ID。
|
4 / uint32
|
游戏开始后经过的毫秒数。
|
1 / uint8
|
始终为0。
|
2 / uint16
|
客户端的游戏端口。用于地图信息交换、直接私聊、主机变更等等。
|
4 / uint32
|
客户端会话计数器。初始值为1,每加入一个游戏都会自增。
|
N/以'\0'结束的字符串
|
用户名。
|
2 / uint16
|
可用的公共端口。这里记为P。
|
16 * P / sockaddr_in * P
|
每个公共端口都有一个套接字sockaddr_in结构。
|
字节 / 类型
|
用途
|
4 / uint32
|
理由标志。还需进一步研究。
|
字节 / 类型
|
用途
|
1 / uint8
|
需要发送聊天信息的玩家总数,这里记为PN
|
PN / uint8 * PN
|
每个uint8保存一个需发送聊天信息的玩家ID。
|
1 / uint8
|
聊天信息发送者的玩家ID。
|
1 / uint8
|
聊天信息标志。
0x10 – 游戏准备阶段的聊天
0x11 – 变更小队
0x12 – 变更颜色
0x13 – 变更种族
0x14 – 变更生命百分比
0x20 – 游戏进行阶段的聊天
|
字节 / 类型
|
用途
|
4 / uint32
|
发送目标标志。
0x00 – 向所有玩家发送
0x01 – 向盟友发送
0x02 – 向OB/裁判发送
0x03-0x0E – 向特定玩家发送(玩家ID=值-2)
当聊天信息标志为0x10(即游戏准备阶段)时,这段信息将被排除。
|
N/以'\0'结束的字符串
|
聊天字符串。
|
字节 / 类型
|
用途
|
1 / uint8
|
数据。
聊天信息标志 = 0x11: 小队
聊天信息标志 = 0x12: 颜色
聊天信息标志 = 0x13: 种族
聊天信息标志 = 0x14: 生命百分比
参考0x04/0x09玩家位信息部分。
|
字节 / 类型
|
用途
|
4 / uint32
|
地图ID(?)
|
N/以'\0'结束的字符串
|
地图路径
|
4 / uint32
|
地图大小(单位为字节)。
|
4 / uint32
|
整个地图文件的CRC32。
|
4 / uint32
|
地图本地校验码。
|
20 / uint8[20]
|
地图本地SHA-1哈希值,这一段是1.23版后添加的,以防止地图互通。
|
字节 / 类型
|
用途
|
4 / uint32
|
地图ID(?)
|
1 / uint8
|
玩家ID
|
字节 / 类型
|
用途
|
4 / uint32
|
地图ID(?)
|
1 / uint8
|
下载源玩家ID或主机ID
|
4 / uint32
|
可用地图尺寸(下载进度)
|
字节 / 类型
|
用途
|
1 / uint8
|
目标玩家ID
|
1 / uint8
|
源玩家ID
|
4 / uint32
|
地图ID(?)
|
4 / uint32
|
地图文件偏移,用于写入数据。
|
4 / uint32
|
后面这段数据的CRC32。
|
N / uint8[N]
|
地图数据。
|
字节 / 类型
|
用途
|
1 / uint8
|
目标玩家ID
|
1 / uint8
|
源玩家ID
|
4 / uint32
|
地图ID(?)
|
4 / uint32
|
已下载的地图尺寸。
|
字节 / 类型
|
用途
|
1 / uint8
|
目标玩家ID
|
1 / uint8
|
源玩家ID
|
4 / uint32
|
地图ID(?)
|
字节 / 类型
|
用途
|
4 / uint32
|
与0x01数据包的值相同。
|
字节 / 类型
|
用途
|
2 / uint16
|
游戏已用时间,单位是毫秒。
|
2 / uint16
|
下一段数据的CRC32的低16位。
注意:如果游戏数据为空,这段数据本身也会被排除,这样整个包就只有6字节。
|
N / uint8[N]
|
游戏数据。
|
字节 / 类型
|
用途
|
1 / uint8
|
玩家ID
|
字节 / 类型
|
用途
|
2 / uint16
|
游戏已用时间,单位是毫秒。这里始终是0。
|
2 / uint16
|
下一段数据的CRC32的低16位。
注意:如果游戏数据为空,这段数据本身也会被排除,这样整个包就只有6字节。
|
N / uint8[N]
|
游戏数据。
|
字节 / 类型
|
用途
|
N / uint8[N]
|
玩家操作数据,参考0x0C以获得更多信息。
|
字节 / 类型
|
用途
|
4 / uint32
|
同步哈希值。
|
魔兽争霸III数据包规范相关推荐
- 魔兽争霸游戏开始前数据包分析
转载自:http://blog.csdn.net/binbin0303/article/details/3074755 1.搜索局域网游戏:UDP,端口6112. 0x0000 FF FF FF ...
- LoRa节点开发:5、代码详解LoRaWAN中的几种数据包(发送与接收数据)
本文来源微信公众号[物联网思考] 本文主要结合LoRaNode SDK v4.4.2和LoRaWAN规范1.0.3来展开. 1.数据包类型 LoRaWAN规范中有不同的数据包,通过MType字段区分, ...
- Linux内核中网络数据包的接收-第一部分 概念和框架
与网络数据包的发送不同,网络收包是异步的的.由于你不确定谁会在什么时候突然发一个网络包给你.因此这个网络收包逻辑事实上包括两件事: 1.数据包到来后的通知 2.收到通知并从数据包中获取数据这两件事发生 ...
- 抓包概念大比较:数据报、数据包、分组
抓包概念大比较:数据报.数据包.分组 数据报.数据包和分组是常见的三个概念.他们是否一样?如果不一样,他们差别在哪里?下面依次说明这三个词.大学霸IT达人 1.数据报:当应用程序按照协议格式构建好要发 ...
- Wireshark数据抓包教程之认识捕获分析数据包
Wireshark数据抓包教程之认识捕获分析数据包 认识Wireshark捕获数据包 当我们对Wireshark主窗口各部分作用了解了,学会捕获数据了,接下来就该去认识这些捕获的数据包了.Wiresh ...
- 【Java 网络编程】UDP 服务器 客户端 通信 ( DatagramSocket | DatagramPacket | UDP 发送数据包 | UDP 接收数据包 | 端口号分配使用机制 )
文章目录 I UDP 信息发送接收原理 II UDP 发送和接收端口相同 III UDP 发送信息代码示例 IV UDP 接收信息代码示例 V UDP 服务器端代码示例 VI UDP 客户端代码示例 ...
- 数据包格式_理解MQTT协议数据包结构
在本教程中,我们将更详细地介绍MQTT协议,以及MQTT消息或数据包的格式. 我们将研究: MQTT消息格式. MQTT消息头 消息字段和编码 控制消息编码示例 介绍 MQTT是基于二进制的协议,控制 ...
- python小数乘法_Polymorph:支持几乎所有现有协议的实时网络数据包操作框架
Polymorph是一个用Python3编写的框架,其允许实时修改网络数据包,为用户提供对数据包内容的最大化控制.该框架旨在实现任何现有协议(包括没有公共规范的私有协议)的网络数据包的实时修改.除此之 ...
- 利用WinPcap技术捕获数据包
前言 随着网络入侵的不断发展,网络安全变得越来越重要,于是网络入侵取证系统的研究也变得日益重要.在网络入侵取证系统中,对网络上传送的数据包进行有效的监听即捕获包是目前取证的关键技术,只有进行高效的数 ...
- C#实现RTP数据包传输
闲暇时折腾IP网络视频监控系统,需要支持视频帧数据包在网络内的传输. 未采用H.264或MPEG4等编码压缩方式,直接使用Bitmap图片. 由于对帧的准确到达要求不好,所以采用UDP传输.如果发生网 ...
最新文章
- maven java 配置文件路径_Maven 的配置文件路径读取
- OpenCV中的图像阈值处理算法
- 用缓动函数模拟物理动画
- android icon在线更新,Android在线更新下载方案
- 华为底部虚拟导航栏挡住布局
- JavaScript数组(2)---遍历/迭代方法 8种
- NuGet是什么?理解与使用(下)
- 远程连接IBM MQ 7.5的“AMQ4036”错误解决
- Floyd算法(附例题)
- SpringBoot+zk+dubbo架构实践(三):部署Dubbo-admin管理平台
- Faster RCNN学习笔记
- 奈奎斯特稳定性判据的步骤(含详细推导)
- Python绘图模块 -- turtle
- 【Bash百宝箱】Makefile快速入门
- 排兵布阵 (分组背包)
- VideoCodec 入门篇 - 00 (编解码简介)
- 模拟电路学习-之容抗和感抗
- vmware虚拟机和云服务器区别,容器云与虚拟机云区别
- FusionInsight
- 从0开始学习 GitHub 系列之「03.Git 速成」----转载自stormzhang 原创文章
热门文章
- 来,看看记事本里会变成乱码的字……不仅仅是“联通”而已……
- Latex系列(三)---IEEE Tran模板介绍
- 这个开源项目有点强,无需编码,可一键生成前后端代码
- (一)软件测试的目的和定义
- JVM学习--垃圾回收机制
- 字符串匹配算法之Aho-Corasick
- uni-app 使用API中的uni.chooseImage 上传照片以及uni.previewImage图片预览(身份证照片为例)
- 鸿蒙时代实力排名,混沌氏(浑沌)、鸿蒙氏,盘古开天辟地时两个最强大的部落首领?...
- 金融工程学(五):互换概述
- 美团23届秋招全面启动!5000+机会,60+岗位,3次笔试机会!