用lua语言编写Wireshark插件解析自定义协议

合集下载

wireshark协议分析

wireshark协议分析

wireshark协议分析Wireshark协议分析Wireshark是一个功能强大的网络协议分析工具,它能够捕获、分析和显示网络数据包中的数据。

通过使用Wireshark,我们可以深入了解网络通信过程中的协议细节,追踪数据包的传输路径,发现潜在的安全风险,并进行网络性能优化。

在进行协议分析之前,我们首先需要捕获网络数据包。

Wireshark支持在多个平台上运行,包括Windows、Mac OS和Linux。

它能够通过本地网络接口或远程连接捕获网络数据包。

当我们开始捕获数据包时,Wireshark会显示一个实时的数据包列表,并提供详细的信息,如源IP地址、目标IP地址、协议类型、端口号等。

在开始分析数据包之前,我们可以通过使用过滤器来限制需要关注的数据包。

Wireshark支持使用协议、源IP地址、目标IP地址、端口号等作为过滤条件。

通过设置适当的过滤器,我们可以只关注我们感兴趣的数据包,而忽略其他不相关的数据。

一旦我们捕获了数据包,我们就可以开始进行协议分析了。

Wireshark提供了许多工具和功能来帮助我们分析协议。

其中一个很有用的功能是重构TCP流。

当网络中的数据包是以多个片段的形式传输时,Wireshark可以将它们重新组装成完整的数据流,以便我们更好地分析和理解通信内容。

此外,Wireshark还可以对数据包进行解码。

它支持解码多种网络协议,包括TCP/IP、UDP、HTTP、DNS等。

通过解码数据包,我们可以查看每个协议中的字段和值,以便更好地理解和分析网络通信过程。

在分析数据包时,我们还可以使用Wireshark提供的统计功能。

Wireshark可以统计网络中的数据包数量、协议类型、数据包大小等信息,并以图表的形式展示。

通过分析这些统计信息,我们可以了解网络的负载情况、流量模式以及网络性能状况。

除了基本的协议分析功能外,Wireshark还支持操作和导出数据包。

我们可以对数据包进行重发、制作过滤器、设置标记等操作。

Wireshark基本用法过滤规则协议详解

Wireshark基本用法过滤规则协议详解

Wireshark基本⽤法过滤规则协议详解基本使⽤:协议解析:(1)版本,占4位,指IP协议的版本,⽬前⼴泛使⽤的IP协议版本号为4(即)。

2)⾸部长度,占4位,可表⽰的最⼤⼗进制数值是15。

请注意,这个字段所表⽰数的单位是32位字长(1个32位字长是4字节),因此,当IP 的⾸部长度为1111时(即⼗进制的15),⾸部长度就达到60字节。

当IP分组的⾸部长度不是4字节的整数倍时,必须利⽤最后的填充字段加以填充。

因此数据部分永远在4字节的整数倍开始,这样在实现IP协议时较为⽅便。

⾸部长度限制为60字节的缺点是有时可能不够⽤。

但这样做是希望⽤户尽量减少开销。

最常⽤的⾸部长度就是20字节(即⾸部长度为0101),这时不使⽤任何选项。

(3)服务类型,占8位,⽤来获得更好的服务,但实际上⼀直没有被使⽤过。

1998年IETF把这个字段改名为区分服务DS(Differentiated Services)。

只有在使⽤区分服务时,这个字段才起作⽤。

(4)总长度,总长度指⾸部和数据之和的长度,单位为字节。

总长度字段为16位,因此数据报的最⼤长度为2^16-1=65535字节。

在IP层下⾯的每⼀种数据链路层都有⾃⼰的帧格式,其中包括帧格式中的数据字段的最⼤长度,这称为最⼤传送单元MTU(Maximum Transfer Unit)。

当⼀个数据报封装成链路层的帧时,此数据报的总长度(即⾸部加上数据部分)⼀定不能超过下⾯的数据链路层的MTU值。

PS:图中总长度为84个字节,ping包默认为56个字节,ICMP包头是8个字节,再加上⾸部长度20个字节。

下图我将包长度设置为112个字节后,总长度就变成140个字节了(5)标识(identification),占16位。

IP软件在存储器中维持⼀个计数器,每产⽣⼀个数据报,计数器就加1,并将此值赋给标识字段。

但这个“标识”并不是序号,因为IP是⽆连接服务,数据报不存在按序接收的问题。

wireshark协议树解析步骤

wireshark协议树解析步骤

wireshark协议树解析步骤Wireshark是一款功能强大的网络分析工具,可以用于捕获、分析和解码网络数据包。

它可以解析多种网络协议,并以可视化的方式呈现协议树的结构。

以下是解析Wireshark协议树的一般步骤:2. 启动Wireshark:安装完成后,启动Wireshark应用程序。

主界面显示了可用的网络接口。

3. 选择捕获接口:Wireshark支持同时捕获多个网络接口的数据包。

选择一个接口来捕获所有传入和传出的数据包。

单击所需的接口即可开始捕获。

4. 开始数据包捕获:在单击接口后,Wireshark开始捕获数据包。

捕获进程将始终处于活动状态,直到您停止捕获。

5. 分析捕获的数据包:一旦停止捕获,Wireshark将显示捕获的数据包列表。

每个数据包都会显示源、目标IP地址、协议类型、长度和时间戳等信息。

6.选择要分析的数据包:从列表中选择您要分析的数据包。

您可以单击其中一个数据包以查看详细信息。

7. 查看协议树:选中一个数据包后,Wireshark将在下半部分显示包含协议树的详细信息。

协议树以树状结构显示,从最底层的数据链路层开始,逐级向上解析各个网络层,直到应用层。

8.展开协议树:在协议树中,您可以展开不同的协议层级以查看更详细的信息。

单击“+”或双击具有“+”符号的协议名称,以展开该层级。

9.查看协议详细信息:展开每个协议层级后,您可以查看该协议的详细信息。

例如,如果展开了“传输层”协议,您将看到TCP或UDP的详细信息。

10. 分析协议字段:在协议的详细信息中,您可以查看不同的字段和值。

Wireshark在对每个字段进行解码时会提供解析结果,如源端口、目标端口、标志位等。

11. 过滤数据包:如果您只想查看特定类型的数据包,可以使用Wireshark的过滤功能。

通过在过滤框中输入过滤条件,可以只显示符合该条件的数据包。

12.导出协议树:如果您想保存协议树,可以将其导出为纯文本或HTML格式。

使用wireshark进行协议分析实验报告

使用wireshark进行协议分析实验报告

使用wireshark进行协议分析实验报告一、实验目的本次实验旨在掌握使用Wireshark进行网络协议分析的方法与技巧,了解网络通信特点和协议机制。

二、实验内容及步骤1.实验准备b.配置网络环境:保证实验环境中存在数据通信的网络设备和网络流量。

2.实验步骤a. 打开Wireshark软件:启动Wireshark软件并选择需要进行抓包的网络接口。

b. 开始抓包:点击“Start”按钮开始抓包,Wireshark将开始捕获网络流量。

c.进行通信:进行网络通信操作,触发网络流量的产生。

d. 停止抓包:点击“Stop”按钮停止抓包,Wireshark将停止捕获网络流量。

e. 分析流量:使用Wireshark提供的分析工具和功能对抓包所得的网络流量进行分析。

三、实验结果通过Wireshark软件捕获的网络流量,可以得到如下分析结果:1. 抓包结果统计:Wireshark会自动统计捕获到的数据包数量、每个协议的数量、数据包的总大小等信息,并显示在界面上。

2. 协议分析:Wireshark能够通过解析网络流量中的各种协议,展示协议的各个字段和值,并提供过滤、等功能。

3. 源和目的地IP地址:Wireshark能够提取并显示各个IP数据包中的源IP地址和目的地IP地址,帮助我们分析网络通信的端点。

四、实验分析通过对Wireshark捕获到的网络流量进行分析,我们可以得到以下几个重要的分析结果和结论:1.流量分布:根据抓包结果统计,我们可以分析不同协议的数据包数量和比例,了解网络中各个协议的使用情况。

2. 协议字段分析:Wireshark能够对数据包进行深度解析,我们可以查看各个协议字段的值,分析协议的工作机制和通信过程。

3.网络性能评估:通过分析网络流量中的延迟、丢包等指标,我们可以评估网络的性能,并找出网络故障和瓶颈问题。

4. 安全分析:Wireshark能够分析HTTP、FTP、SMTP等协议的请求和响应内容,帮助我们发现潜在的网络安全问题。

使用 LUA 编写 WIRESHARK 协议解析插件

使用 LUA 编写 WIRESHARK 协议解析插件

使用LUA 编写WIRESHARK 协议解析插件一、平台操作系统:windows 7wireshark:1.10.3lua:5.1二、准备lua 语言基本语法,特别是关于表操作和循环wireshark 文档,包括用户使用文档和开发者文档,这些在wireshark 官方网站都能找到三、开始我们首先定义一个简单的协议,我们使用 C 语言的语法描述,1struct foo2{3char protocol_type[16]; /* request response notify */4 char service_type[16]; /* 我们定义的各种服务类型 */5 unsigned intmsg_len; /* 消息体的长度 */6char msg_content[0]; /* 消息体的内容,由于是变长的所以采用此方法定义 */7 };现在可以让我们使用lua 定义一个最基本的框架1do 2--[[ 3创建一个新的协议结构 foo_proto 4第一个参数是协议名称会体现在过滤器中 5第二个参数是协议的描述信息,无关紧要 6 --]] 7local foo_proto = Proto("foo", "Foo Protolcol") 8 9--[[10下面定义字段11 --]]12local foo_protocol_type =ProtoField.string("foo.prototype", "Protocol Type", base.NONE)13local foo_service_type = ProtoField.string("foo.servicetype", "Service Type", base.NONE)14local foo_msg_len = ProtoField.uint32("foo.msglen", "Message Length", base.DEC)15local foo_msg_content =ProtoField.string("foo.msgcontent", "Message Content", base.NONE)1617 -- 将字段添加都协议中18 foo_proto.fields = {19 foo_protocol_type,20 foo_service_type,21 foo_msg_len,22 foo_msg_content23 }24 25--[[26下面定义 foo 解析器的主函数,这个函数由 wireshark调用27第一个参数是 Tvb 类型,表示的是需要此解析器解析的数据28第二个参数是 Pinfo 类型,是协议解析树上的信息,包括 UI 上的显示29第三个参数是 TreeItem 类型,表示上一级解析树30 --]]31function foo_proto.dissector(tvb, pinfo,treeitem)3233-- 设置一些 UI 上面的信息34pinfo.cols.protocol:set("FOO")35 :set("FooProtocol")3637local offset = 038local tvb_len = tvb:len()3940-- 在上一级解析树上创建 foo 的根节点41local foo_tree = treeitem:add(foo_proto, tvb:range(offset))4243-- 下面是想该根节点上添加子节点,也就是自定义协议的各个字段44-- 注意 range 这个方法的两个参数的意义,第一个表示此时的偏移量45-- 第二个参数代表的是字段占用数据的长度46 foo_tree:add(foo_protocol_type, tvb:range(offset, 16))47offset = offset+16 48 foo_tree:add(foo_service_type,tvb:range(offset, 16))49 offset = offset+1650foo_tree:add(foo_msg_len, tvb:range(offset, 4))51 offset = offset+452 53-- 计算消息内容的长度54local foo_content_len =tvb_len-offset55 foo_tree:add(foo_msg_content, tvb:range(offset, foo_content_len))56 offset = offset+foo_content_len5758end5960-- 向 wireshark 注册协议插件被调用的条件61localtcp_port_table = DissectorTable.get("tcp.port")62tcp_port_table:add(12345, foo_proto)63end四、扩展(1)单TCP 分节多应用PDU这种情况可以在我们的协议解析函数中使用循环解决,但是应用层PDU 一般都需要有我们自定义的分割标识符,不然无法区分,这里我们使用协议尾端标记的方式,采用0xFF分割,这里我们假设我们的协议体中不会出现这个值,也就是我们的消息体长度字段的值不会出现这个值。

使用Lua编写Wireshark插件

使用Lua编写Wireshark插件

Q&A,谢谢!
为什么选择Lua编写插件
优点
代码量少,使用简单 不用担心内存管理 插件方便共享 比C慢 只能为部分功能写插件 使用不广泛
缺点
在Wireshark中如何使用Lua
安装目录下配置文件init.lua中改为disable_lua = false 在安装目录下新建hello.lua文件,写入: print("Hello world!") 在命令行中执行
> cd /d C:\Program Files\Wireshark > tshark -X lua_script:hello.lua 如果屏幕上打印出Hello world!,说明配置成功
插件种类
Dissectors
解析器,解析报文数据
Post-dissectors
后置解析器,其他所有解析器调用完成后,再调用的解析器
Help
/LuaAPI Wireshark菜单Help->Contents打开Wireshark User ‘s Guide里面Lua Support in Wireshark
编写插件的一些小技巧
编写好插件,可以通过Wireshark即时验证,菜单Tools>Lua->Evaluate 使用debug()或者print()函数打印调试信息,需要先打开 控制台,菜单Tools->Lua->Console 把协议分析文档的定义直接放到自定义插件头部,注释 掉,以后查看方便,文本编辑器都支持块注释 写解析函数时,根据协议文档定义符合各Rule的函数, 如:例子中符合Rule1和Rule2的函数
Listeners
A Listener, is called once for every packet that matches a certain filter or has a certain tap. It can read the tree, the packet's Tvb eventually the tapped data but it cannot add elements to the tree.

wireshark插件开发完整解决方案

wireshark插件开发完整解决方案
将其修改为本机 python.exe 和其安装目录的位置,例如:C:\Python24\Python.exe (6)MSVCR_DLL
如果 VS 不是安装在 C 盘,请在这里相应的地方用绝对路径表示,而不要去修改前面的 PROGRAM_FILES。 (7)MAKENSIS
如果你没有安装 NSIS 安装程序制作工具, 用#注释掉此行. (8)HHC_DIR
1.解析器的本质工作
作为一个协议解析器,其要完成的工作是将数据包中,解析器所针对的协议部分的各个 字段的信息,进行详细地呈现。观察 wireshark 的界面程序,在显示一个数据包的详细内容 的窗口中,是以一个树形的结构来将数据包划分成各层协议,并展示各部分的含义。同时, 在数据包列表主窗口中,还显示的有各个数据包的概览信息,并可以通过相关的过滤规则进 行筛选显示。所以,解析器的核心工作就在于数据包详细内容窗口部分的树形结构的维护, 并结合过滤器、数据包列表等部分,进行筛选与信息的呈现。
wireshark 开发环境搭建一些参考资料: /hcj2002/article/details/2255637#cpp (Wireshark 编译环境设置和编译) /stk_tianwen/article/details/5306912 (windows 下 wiershark 插件开发之源码编译[主要是环境搭建过程中可能会遇到的问题]) /docs/wsdg_html_chunked/ (wireshark 开发人员文档) /KB/IP/custom_dissector.aspx (整个解决方案:codeproject 社区)
a. Archive/unzip b. Devel/bison c. Devel/flex
d. Interpreters/perl e. Utils/patch f. Web/wget

Wireshark录取自定义报文的方法

Wireshark录取自定义报文的方法

Wireshark录取自定义报文的方法Wireshark是一款开源的网络协议分析工具,它可以捕获和分析网络流量。

Wireshark支持多种协议,并且允许用户录取自定义的报文进行进一步分析。

下面将介绍一种使用Wireshark录取自定义报文的方法。

首先,我们需要准备一个自定义的报文。

一个典型的报文由报文头和报文体组成。

报文头通常包括各种字段,例如源IP地址、目标IP地址、协议类型等信息。

报文体通常包含报文的具体内容,可以是文本数据、二进制数据或其他类型的数据。

接下来,打开Wireshark并选择一个适当的接口进行网络抓包。

Wireshark支持多种接口,可以是以太网、无线网络或其他类型的接口。

在Wireshark的主界面中,会显示一个实时的网络流量列表。

这个列表显示了从所选接口捕获的所有网络流量。

要录取自定义报文,需要设置过滤器来仅显示希望捕获的报文。

在Wireshark的过滤栏处,可以输入一个过滤表达式。

过滤表达式可以用于选择特定类型的报文。

例如,可以使用IP过滤表达式来仅显示与IP协议相关的报文:ip。

还可以使用端口过滤表达式来仅显示特定端口号的报文:tcp.port == 80。

当我们输入适当的过滤表达式后,Wireshark会自动应用过滤器,并只显示符合条件的报文。

接下来,我们需要发送自定义报文。

我们可以使用一个网络工具,例如cURL或Telnet,来发送自定义报文。

这些工具使我们能够以各种方式与服务器进行交互。

使用cURL发送自定义报文时,可以使用以下命令格式:```curl -X [请求方法] -H "Content-Type: [内容类型]" -d '[报文内容]' [目标URL]```其中,[请求方法]是报文的请求方法,例如GET、POST等。

[内容类型]是报文的内容类型,例如application/json。

[报文内容]是报文的具体内容,例如JSON格式的文本数据。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

用lua语言编写Wireshark插件解析自定义协议Wireshark默认支持大量网络协议,我们可以在Wireshark主菜单“Internals > Support Protocols (slow!)”查看当前支持的所有协议。

Wireshark 1.6.2版本已支持1170种协议,包括我们熟悉的Diameter、GTP、FTP、SCTP等协议。

上述都是业界的通用协议,然而对我们产品的自定义协议,Wireshark是不得而知的,抓包后只能看到一串二进制码流,导致开发调试或者测试分析效率较低。

有什么办法让Wireshark也能解析自定义协议呢?本文介绍的用lua编写Wireshark解析器插件就是一种常用方法。

Wireshark软件内嵌一个lua语言执行引擎并提供一系列lua函数接口,从而满足用户各种各样的协议解析目的。

下面以一个简单的自定义协议为例,演示如何编写Wireshark解析插件。

不过本文只是业余学习的笔记和简单实践,不能覆盖“lua编写Wireshark解析器插件”的所有知识点(更全面的介绍请参考Wireshark软件自带手册第11章“Lua Support in Wireshark”,只是开源软件的手册似乎总是不够详尽。

)。

1. 配置Wireshark执行lua脚本通过Wireshark主菜单“Help > About Wireshark”可以查看当前安装版本已经内嵌Lua 5.1执行引擎。

默认安装情况下Wireshark会在安装路径下生成一个init.lua,它是Wireshark启动过程执行的第一个lua脚本。

一般来说,我们可以在此文件中添加dofile函数调用其他lua 脚本,实现各种扩展目的。

例如,默认安装后init.lua文件末尾有一句:dofile(DATA_DIR.."console.lua")此语句执行了安装目录下的console.lua脚本,该脚本也是Wireshark自带的,用途是在主菜单Tool下创建一个子菜单Lua。

我们甚至可以在上述语句之前添加注释--符来取消它。

dofile是lua基础库提供的一个函数,用途如下:dofile (filename)Opens the named file and executes its contents as a Lua chunk. When called without arguments, dofile executes the contents of the standard input (stdin). Returns all values returned by the chunk. In case of errors, dofile propagates the error to its caller (that is, dofile does not run in protected mode).我们下来编写的解析器也是以.lua脚本形式保存,然后在init.lua文件末尾中添加一个dofile调用即可。

2. 需要解析的自定义协议假设我们需要基于UDP协议实现一种根据员工ID查询员工姓名的信息服务,客户端向将上述协议实现之后,服务器端部署在192.168.56.1,客户端在192.168.56.22。

以下就是启动1次查询过程的Wireshark抓包结果:上图是QueryRequest消息,uEmployeeID指定为1。

上图是QueryResponse消息,返回uEmployeeID=1的查询结果。

从上面2个图可见,Wireshark已经自动地把以太网帧、IP报文、UDP数据报都解析出来,唯独我们自定义协议的消息无法解析,以Data来显示。

把上述抓包结果保存到一个pcap 文件中。

下面我们逐步实现对该协议的解析。

3. Wireshark的lua函数接口3.1. Proto 协议在Wireshark中Proto主要用途是声明一个新的协议,进而可以给它编写解析器函数。

3.1.1. Proto.new:声明一个新的协议例如:my_proto = Proto ("myProto","My Protocol for Query Employee","My Self-defined Protocol") 3.1.2. proto.dissector:解析器函数例如:function my_proto.dissector(buffer,pinfo,tree)pinfo.cols.protocol:set("myProto"):set("This is a message of myProto")enddissector函数的第一个参数buffer对应需要解析的二进制码流,第二个参数pinfo对应Packet List窗口的信息,tree是Packet Details窗口的树结构,如下图所示:Wireshark已经为我们提供了处理这三个参数的接口了。

有关buffer的lua API,可以参考官方手册“11.12. Functions for handling packet data”,如下图所示:有关pinfo的lua API,可以参考官方手册“11.9. Obtaining packet information ”,如下图所示:有关tree的lua API,可以参考官方手册“11.11. Adding information to the dissection tree”,如下图所示:把上述代码保存到一个d:/myproto.lua脚本中,并在init.lua脚本中末尾增加一句:dofile("d:/myproto.lua")然后启动Wireshark程序,就可以在协议列表中找到我们定义的协议了,如下图所示:3.2 ProtoField 协议字段(域)但凡协议都有具体的字段,Wireshark提供了25种函数可以创建各种类型字段(详细请参考帮助文档11.10.6. ProtoField)。

我前面定义的协议字段类型很简单,只有16位无符号整数、32位无符号整数、32字符长度的字符串三种。

下面是各字段的具体lua代码实现:然后我们把这些字段加到前面定义的Proto中去:my_proto.fields = { f_usMsgType, f_uiEmployeeID, f_usQueryResult, f_szEmployeeName }把上述代码追加到d:/myproto.lua脚本中,重启Wireshark就可以看到MYPROTO协议已经具有4个字段了:我们还可以在主窗口的“显示过滤表达式”快捷方式中,指定上述字段来做过滤:如下图所示,左侧Field name窗口中选择了usMsgType后,右侧显示了我们前面预定义的两个取值:3.2. DissectorTable 协议解析器表DissectorTable就是若干协议解析器(Dissector)汇集成Table,Wireshark默认支持了一系列Dissector和DissectorTable,在主菜单“Internals > Dissector tables”可以查看当前已支持的DissectorTable,如下图所示:图中所示的UDP port就是一个DissectorTable,它底下包含很多不同端口号,根据具体UDP端口号调用具体Dissector来解析协议消息。

例如UDP端口号69是TFTP协议采用的知名端口,Wireshark遇到这种消息将自动调用TFTP协议解析器来处理。

本文介绍的自定义协议基于UDP端口号12345,所以我也把它添加到UDP port这个DissectorTable下。

3.2.1. DissectorTable.get:返回指定的DissectorTable实例下面的代码首先通过DissectorTable.get获取了“udp.port”表:Local udp_port_table = DissectorTable.get("udp.port")3.2.2 dissectortable:add:向DissectorTable实例中添加dissectorLocal my_port = 12345Udp_port_table:add(my_port, my_proto)把上述代码追加到d:/myproto.lua脚本中,重启Wireshark就可以看到MYPROTO已经增加UDP port下面:不但如此,我们打开前面抓包的文件,可以看到有些东西悄悄变化了:说明前面的解析器函数已经被正确调用了,至此我们已经完成了一个解析器雏形。

下面将完善解析器函数,使之真正能够解析协议消息。

4. 自定义协议的解析器函数我们要怎么呈现解析结果呢?看看下图是Wireshark默认对UDP协议的解析结果:我们自定义协议的解析也将生成一个类似的树状结构。

前面我们已经写了一个简单的my_proto.dissector函数函数如下所示:function my_proto.dissector(buffer,pinfo,tree)pinfo.cols.protocol:set("myProto"):set("This is a message of myProto")end参数tree就是我们要构造的树状结构的根节点,通过下面两句代码添加一个子节点代表自定义协议:local buffer_len = buffer:len()local myProtoTree = tree:add(my_proto, buffer(0, buffer_len), "My Protocol for Query Employee Information")第1句表示获取buffer参数的字节长度;第二句调用了tree:add方法创建一个子节点并复制给myProtoTree,第1个参数是协议,第2个参数是buffer数据范围, 第3个参数是子节点的标题,作用类似于”User Datagram Protocol ….”那一行。

下面是解析第1个字段”消息类型”的代码:local offset = 0local usMsgType = buffer(offset,2):le_uint()if usMsgType <= 1 thenmyProtoTree:add_le(f_usMsgType, buffer(offset,2))else:set("Invalid MessageType("MsgType .. ")")returnendoffset = offset + 2第1句定义一个局部变量offset表示当前字段在buffer缓冲区的偏移量,后续每解析一个字段都要设置一下偏移量。

相关文档
最新文档