关于python中的struct.unpack()

2024-03-17

级别:初级。我目前正在使用原始套接字使用 python 来开发嗅探器。 我有一个关于 struct 模块提供的 unpack() 中使用的格式说明符的一般性问题。当我们使用此方法根据指定的格式说明符解包数据时。我见过很多嗅探器程序使用 unpack() 从十六进制形式解码数据包信息。 例如,为了提取以太网标头信息,可以使用以下代码:

ethHeader = struct.unpack("!6s6s2s", ethernetHeader)

这里的 ethernetHeader 是变量,包含之前从原始套接字捕获的实际以太网标头数据。现在我的问题是如何知道标题使用哪种格式说明符?我如何提前知道以太网地址是字符串格式还是其他格式?是否也有这方面的文档。我阅读了与 unpack() 相关的 python 文档,但没有找到任何信息。类似地,对于 IP 地址,代码如下:

ipAddresses = struct.unpack("!12s4s4s", IPAddresses)

这里的 IPAddresses 是变量,包含之前从原始套接字捕获的实际 IP 地址信息。我怎么知道我必须使用字符串作为格式说明符(!12s4s4s)。 谢谢。


感谢 J.F. Sebastian 的提示。我终于弄清楚了,并将花一些时间在这里解释它。通常,我们必须在每个标头的结构中查找 C 类型,以了解数据包的不同标头中的每个字段使用什么 C 类型。那么稍后我们就可以使用这个table http://docs.python.org/2/library/struct.html#format-characters了解哪个格式说明符将代表哪种 C 类型。例如,对于 IP 标头,结构如下所示:

struct ipheader {
 unsigned char ip_hl:4, ip_v:4; /* this means that each member is 4 bits */
 unsigned char ip_tos;
 unsigned short int ip_len;
 unsigned short int ip_id;
 unsigned short int ip_off;
 unsigned char ip_ttl;
 unsigned char ip_p;
 unsigned short int ip_sum;
 unsigned int ip_src;
 unsigned int ip_dst;
}; 

例如:unsigned char 表示为“B”,unsigned int 表示为“I”。现在我们可以使用此方法来了解 struct.unpack() 中应使用什么格式说明符来获取 IP 标头的字段值。如果是 IP 标头,则如下所示:

struct.unpack('!BBHHHBBHII')

但你会注意到大多数程序都使用struct.unpack('!BBHHHBBH4s4s').

那么问题来了,为什么在这种情况下unsigned int ip_src; & unsigned int ip_dst;使用“s”代替“I”作为格式说明符struct.unpack()。原因是如果“I”用作格式说明符,则unpack()方法以整数形式返回 IP 地址(例如:3232267778)。然后你必须将其转换为实际的IP地址形式(例如:10.0.0.1)。通常在互联网上可用的嗅探器程序中只需使用socket.inet_ntoa()用于获取实际的IP地址。此方法接受字符串类型而不是整数类型。这就是为什么在 unsigned int ip_src 的情况下; & 无符号 int ip_dst;在 struct.unpack() 中使用“s”代替“I”作为格式说明符,以便稍后可以将结果提供给 socket.inet_ntoa() 以获取实际 IP 地址格式的 IP 地址。以太网标头的情况也是如此。我们在 struct.unpack() 中使用“s”而不是“B”,因为我们需要一个可以稍后输入的字符串binascii.hexlify()以获取实际 MAC 地址格式的 MAC。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

关于python中的struct.unpack() 的相关文章

  • 如何在刻度标签和轴之间添加空间

    我已成功增加刻度标签的字体 但现在它们距离轴太近了 我想在刻度标签和轴之间添加一点呼吸空间 如果您不想全局更改间距 通过编辑 rcParams 并且想要更简洁的方法 请尝试以下操作 ax tick params axis both whic
  • 将字符串转换为带有毫秒和时区的日期时间 - Python

    我有以下 python 片段 from datetime import datetime timestamp 05 Jan 2015 17 47 59 000 0800 datetime object datetime strptime t
  • 如何打印没有类型的defaultdict变量?

    在下面的代码中 from collections import defaultdict confusion proba dict defaultdict float for i in xrange 10 confusion proba di
  • 如何在 Sublime Text 2 的 OSX 终端中显示构建结果

    我刚刚从 TextMate 切换到 Sublime Text 2 我非常喜欢它 让我困扰的一件事是默认的构建结果显示在 ST2 的底部 我的程序产生一些很长的结果 显示它的理想方式 如在 TM2 中 是并排查看它们 如何在 Mac 操作系统
  • 如何等到 Excel 计算公式后再继续 win32com

    我有一个 win32com Python 脚本 它将多个 Excel 文件合并到电子表格中并将其另存为 PDF 现在的工作原理是输出几乎都是 NAME 因为文件是在计算 Excel 文件内容之前输出的 这可能需要一分钟 如何强制工作簿计算值
  • SQL Alchemy 中的 NULL 安全不等式比较?

    目前 我知道如何表达 NULL 安全的唯一方法 SQL Alchemy 中的比较 其中与 NULL 条目的比较计算结果为 True 而不是 NULL 是 or field None field value 有没有办法在 SQL Alchem
  • 打破嵌套循环[重复]

    这个问题在这里已经有答案了 有没有比抛出异常更简单的方法来打破嵌套循环 在Perl https en wikipedia org wiki Perl 您可以为每个循环指定标签 并且至少继续一个外循环 for x in range 10 fo
  • keras加载模型错误尝试将包含17层的权重文件加载到0层的模型中

    我目前正在使用 keras 开发 vgg16 模型 我用我的一些图层微调 vgg 模型 拟合我的模型 训练 后 我保存我的模型model save name h5 可以毫无问题地保存 但是 当我尝试使用以下命令重新加载模型时load mod
  • NameError:名称“urllib”未定义”

    CODE import networkx as net from urllib request import urlopen def read lj friends g name fetch the friend list from Liv
  • 在pyyaml中表示具有相同基类的不同类的实例

    我有一些单元测试集 希望将每个测试运行的结果存储为 YAML 文件以供进一步分析 YAML 格式的转储数据在几个方面满足我的需求 但测试属于不同的套装 结果有不同的父类 这是我所拥有的示例 gt gt gt rz shorthand for
  • python 集合可以包含的值的数量是否有限制?

    我正在尝试使用 python 设置作为 mysql 表中 ids 的过滤器 python集存储了所有要过滤的id 现在大约有30000个 这个数字会随着时间的推移慢慢增长 我担心python集的最大容量 它可以包含的元素数量有限制吗 您最大
  • 使用 OpenPyXL 迭代工作表和单元格,并使用包含的字符串更新单元格[重复]

    这个问题在这里已经有答案了 我想使用 OpenPyXL 来搜索工作簿 但我遇到了一些问题 希望有人可以帮助解决 以下是一些障碍 待办事项 我的工作表和单元格数量未知 我想搜索工作簿并将工作表名称放入数组中 我想循环遍历每个数组项并搜索包含特
  • Python - 按月对日期进行分组

    这是一个简单的问题 起初我认为很简单而忽略了它 一个小时过去了 我不太确定 所以 我有一个Python列表datetime对象 我想用图表来表示它们 x 值是年份和月份 y 值是此列表中本月发生的日期对象的数量 也许一个例子可以更好地证明这
  • 通过数据框与函数进行交互

    如果我有这样的日期框架 氮 EG 00 04 NEG 04 08 NEG 08 12 NEG 12 16 NEG 16 20 NEG 20 24 datum von 2017 10 12 21 69 15 36 0 87 1 42 0 76
  • 从 pygame 获取 numpy 数组

    我想通过 python 访问我的网络摄像头 不幸的是 由于网络摄像头的原因 openCV 无法工作 Pygame camera 使用以下代码就像魅力一样 from pygame import camera display camera in
  • 为美国东部以外地区的 Cloudwatch 警报发送短信?

    AWS 似乎没有为美国东部以外的 SNS 主题订阅者提供 SMS 作为协议 我想连接我的 CloudWatch 警报并在发生故障时接收短信 但无法将其发送到 SMS YES 经过一番挖掘后 我能够让它发挥作用 它比仅仅选择一个主题或输入闹钟
  • Python:计算字典的重复值

    我有一本字典如下 dictA unit1 test1 alpha unit1 test2 beta unit2 test1 alpha unit2 test2 gamma unit3 test1 delta unit3 test2 gamm
  • 设置 torch.gather(...) 调用的结果

    我有一个形状为 n x m 的 2D pytorch 张量 我想使用索引列表来索引第二个维度 可以使用 torch gather 完成 然后然后还设置新值到索引的结果 Example data torch tensor 0 1 2 3 4
  • 如何从没有结尾的管道中读取 python 中的 stdin

    当管道来自 打开 时 不知道正确的名称 我无法从 python 中的标准输入或管道读取数据 文件 我有作为例子管道测试 py import sys import time k 0 try for line in sys stdin k k
  • 用于运行可执行文件的python多线程进程

    我正在尝试将一个在 Windows 上运行可执行文件并管理文本输出文件的 python 脚本升级到使用多线程进程的版本 以便我可以利用多个核心 我有四个独立版本的可执行文件 每个线程都知道要访问它们 这部分工作正常 我遇到问题的地方是当它们

随机推荐

  • Rails 6 中的自动加载和 Zeitwerk 模式

    Rails 6 中的 Zeitwerk 模式中是否有任何代码被折旧 class Application lt Rails Application Initialize configuration defaults for originall
  • 执行批量插入 SQLAlchemy 的最佳方法

    我有一张桌子叫products 其中有以下列id product id data activity id 我本质上想做的是复制大量现有产品并更新它activity id并在产品表中创建新条目 例子 我已经有 70 个 Activity id
  • MATLAB 奇怪的“输入参数太多”错误

    对于一个项目 我尝试使用 matlab 调用另一个 m 文件中的函数 然而 它说 没有足够的输入参数 即使我确实传递了我相当确定是足够的输入参数 在 eval square m 中 function f eval square x fitn
  • AWS Cloudwatch 未触发 API 调用

    我试图在任何 API 调用上创建规则触发器以进行创建 但没有取得任何成功 我有另一个规则 每当 ec2 实例运行时就会触发该规则 但该规则不会针对 RunInstances 触发 尽管我在 API 日志中看到带有 RunInstances
  • emacs 跨帧跟随模式

    有没有一种方法可以像在跟随模式中那样获得行为 但可以在单独的框架中跨越多个窗口 我必须处理一些令人讨厌的遗留代码 这些代码有七页砖块 八层深度的嵌套 for 循环 其中有很多 goto 它有助于查看尽可能多的代码 以便充分理解和重写它 而不
  • Symfony2 表单用数据预填充字段

    暂时假设该形式使用了一个虚构的Animal文档对象类来自ZooCollection只有两个属性 名称 和 颜色 symfony2 questions tagged symfony2 我正在寻找一个工作简单愚蠢的解决方案 to pre fil
  • Streambuf到底是什么?我该如何使用它?

    我正在尝试更多地了解 I O 流在 C 中如何工作 但我真的很困惑何时使用什么 到底什么是streambuf 我什么时候使用streambuf 与string an istream or a vector 我已经知道最后三个 但不知道如何s
  • 如何在 Odoo 模板语言中使用 if

    我正在尝试使用与 Django 中相同的功能 div class 在 Odoo 我有 div
  • 使用 Runtime.getRuntime().exec(command) 时用户向命令行输入;

    我认为这是不可能的 但我一直在使用 Process p Runtime getRuntime exec command 在命令行上运行命令 但现在我遇到了一种情况 我正在运行的命令会要求一些用户输入 例如用户名 这无法通过正在执行的命令的参
  • 如何从 emberjs 中的操作返回值

    如何从操作中返回一些值 我试过这个 var t this send someAction params actions someAction function return someValue 操作不返回值 仅返回 true false u
  • 在java中选择特定类型的文件

    我使用以下代码在 java 中选择文件 File folder new File path to folder File listOfFiles folder listFiles 现在如果我只想选择图像文件该怎么办 使用以下版本之一File
  • 如何从 DSpace 反馈页面的修改版本中获取引用页面(项目)的标题?

    如何从反馈页面的修改版本中获取项目的标题 就像 jspui 中的 推荐此项目 一样 我希望也能生成页面的结果网址 如下所示http example com feedback handle 123456789 123 http example
  • 在pygame中打印用户的输入

    我几乎已经完成了我正在为学校项目制作的一款游戏 但现在我在游戏的一小部分上遇到了困难 我能够获取用户的姓名并使用它来将其写入排行榜 csv 文件 但我想要这样做 以便无论用户键入什么 游戏都会将用户的输入打印到屏幕上 就像您键入时一样在搜索
  • 如何在Python中计算NTLM哈希值?

    如何在 python 中计算密码的 NTLM 哈希值 有任何库或示例代码吗 我想要它用 python 编写 NTLM 强力工具 如 Cain 和 Abel 它的使用其实非常简单hashlib here http docs python or
  • 如何从 Sass 样式表中仅导入变量和 mixin?

    我正在使用 Zurb Foundation 4 S CSS 框架 并且遇到了大量重复样式的问题 这是因为在每个文件中我 import foundation 中 Foundation 中的所有样式也会导入 规则body row button和
  • Visual Studio 2012 - 从解决方案资源管理器中隐藏文件夹?

    是否可以在 Visual Studio 2012 解决方案资源管理器窗口中隐藏文件夹 我有多个不打算使用的文件夹 文件 它们只是让界面变得混乱 而且很难找到东西 您可以切换 显示隐藏文件 但实际上无法隐藏任何文件 这似乎很不合逻辑 Exam
  • Plone - 在页面中何处存储图像和文件附件的最佳实践?

    我们正在使用 Plone 4 1 3 构建一个 Intranet 网站 并想知道是否有 Plone 最佳实践来存储附加到页面的文件和图像 我们的内联网更像是一个协作站点 用户可以在其中发布新闻项目和其他文章 因此 用户将插入图像 使用 Ti
  • Taskkill /f 不会终止进程

    当我从 VS 启动 VS 的实验实例进行调试并停止调试 有时直接从父 VS 时 zombile devenv exe 进程仍在运行 我无法杀死它 它保留了我的许多 dll 当我以管理员身份登录到这台 64 位 Win7 机器时 我希望能够终
  • 防止点击文件输入的标签打开文件浏览器

    我有一个用户可以上传图像的表单 我正在使用
  • 关于python中的struct.unpack()

    级别 初级 我目前正在使用原始套接字使用 python 来开发嗅探器 我有一个关于 struct 模块提供的 unpack 中使用的格式说明符的一般性问题 当我们使用此方法根据指定的格式说明符解包数据时 我见过很多嗅探器程序使用 unpac