做无线抓包时就曾经设想过显示MAC地址所属组织的名称,一直在研究如何根据MAC查询对应的名称。今天无意看到网上有相关文章,里面有介绍,使用C语言实现。本文使用python来实现。

oui.txt文件可以在官网地址http://standards-oui.ieee.org/oui/oui.txt下载,该文件包含了MAC地址前缀(前MAC地址前三字节,下文直接使用“MAC地址”)、组织名称(即公司名称)、公司地址、国家等信息。截至目前,一共有2万多个记录。本文要做的,只是提取出MAC地址和对应的组织名称,再重新整理,以方便程序查询。

先看一下文件内容:

00-CD-FE   (hex)     Apple, Inc.
00CDFE     (base 16)        Apple, Inc.1 Infinite LoopCupertino  CA  95014US

第一部分为“xx-xx-xx”形式的MAC地址和名称;第二部分类似,但省略掉“-”;第三部分是公司地址信息(含国家,行数较多)。文中选择第二部分,因为可以直接将如“00CDFE”字符串转换成十六进制使用。

提取MAC地址的设计思路很简单,如下:

1、逐行读取oui.txt,利用正则表达式查找上文所说的“第二部分”内容。并放到list中。

2、将list内容排序,方便使用二分查找算法,提高速度。

3、将MAC地址转换成十六进制存储(非字符串,这样省一点空间),组织信息还是用字符串存储。

4、写到文件中。其中头部信息表示着记录的数目。数据部分即为MAC地址和组织信息。组织信息前一字节表示该信息长度。

涉及到的python知识点:

1、正则表达式:re.findall(r"^[A-F0-9].[A-F0-9].[A-F0-9].+$", l)

2、字符串转换成数值:int(mac, 16)

3、字符串转成二进制写入文件:

f1 = open(BIN_FILE, "wb")
format='%ds' % len(org)
byte=struct.pack('i',mac_int) + struct.pack(format,str.encode(org))
f1.write(byte)

4、UTF8编码:

reload(sys)  
sys.setdefaultencoding('utf8')

完整代码如下:

#!/usr/bin/python
# encoding: utf-8
# 解析oui.txt文件 Powred by Late Lee
# 注:文件编码格式为utf-8,oui.txt也必须保证是uft-8
# 如果使用python3.4版本,则不需要调用 sys.setdefaultencoding('utf8')
# 生成bin文件格式:头部共8字节:前4字节表示一共有多少条记录,后面4字节表示最大组织名称长度为多少。数据部:MAC地址及组织名称。
# 耗时2秒完成import os
import re
import struct
import sysOUI_FILE = "oui.txt"
TXT_FILE = "oui_txt.txt"
BIN_FILE = "oui.bin"##################################def write_file():line=0list =[]try:f = open(OUI_FILE, 'r')while True:l = f.readline()if l == '': # endbreakline += 1l = l.strip('\n') # not need \n#print("#%d %s" % (line, l))ret = re.findall(r"^[A-F0-9].[A-F0-9].[A-F0-9].+$", l) # eg 9C8E99if len(ret) != 0:mac = l[:6]mac_int = int(mac, 16) # string to int numberorg = l[22:]org.strip()test = mac+" "+orglist.append(test) # add to listlist.sort()f.close()except:raiseline = 0try:f1 = open(BIN_FILE, "wb")f2 = open(TXT_FILE, "w")f1.write("0000")for i in range(0, len(list)):#print("%d %s" % (i, list[i]))line += 1mac = list[i][:6]mac_int = int(mac, 16) # string to int numberorg = list[i][7:]format='%ds' % len(org) # how many bytes in orgorg_byte = struct.pack(format,str.encode(org))org_len = len(org)byte=struct.pack('i',mac_int) + struct.pack('b',org_len) + struct.pack(format,str.encode(org)) # to byte#print("333#%d 0x%x %d-->%s %s" % (i, mac_int, mac_int, org, org_byte))f1.write(byte) # binarytest = mac + " " + org + "\n"f2.write(test) # textprint("total number: %d max name len: %d" % (line, org_len))f1.seek(0, 0)byte=struct.pack('i',line)f1.write(byte)f1.close()f2.close()except:raiseif __name__ == '__main__': reload(sys)  sys.setdefaultencoding('utf8')write_file()

至此,就完成了MAC信息的提取。最终的二进制文件存储22982条记录,空间只有600KB左右。文本形式的如下:

000000 XEROX CORPORATION
000001 XEROX CORPORATION
000002 XEROX CORPORATION
000003 XEROX CORPORATION
。。。
FCFC48 Apple, Inc.
FCFE77 Hitachi Reftechno, Inc.
FCFEC2 Invensys Controls UK Limited
FCFFAA IEEE Registration Authority

文本仅描述一种方法。存储可以使用定长和变长方式。如下:

1、使用定长存储组织信息,这样无需处理长度不一的组织名称,方便编码。但以牺牲空间为代价,比如使用100字节存储名称,则生成的文件大小由600KB上涨到2MB多。

2、如果要节省空间,可以在每条记录中存储组织名称长度信息,然后在代码中根据此长度动态分配组织名称长度。编码相对复杂一点点。笔者喜欢这个方法。

参考资料:

1、OUI文件:http://standards-oui.ieee.org/oui/oui.txt

2、http://www.cnblogs.com/Anker/archive/2013/12/22/3486344.html

李迟 2017.1.14 周六 凌晨

python实现解析oui.txt并抽取MAC前缀及组织名称相关推荐

  1. python dpkt解析ssl流

    用法:python extract_tls_flow.py -vr  white_pcap/11/2018-01-10_13-05-09_2.pcap  -o pcap_ssl_flow.txt  & ...

  2. python自动解析json_Python语言解析JSON详解

    本文主要向大家介绍了Python语言解析JSON详解,通过具体的内容向大家展示,希望对大家学习Python语言有所帮助. JSON 函数使用 JSON 函数需要导入 json 库:import jso ...

  3. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  4. python url解析path_Django(CBV解析、模板层)

    https://www.zhihu.com/video/1249450287595159552 每日测验 """ 今日考题 1.反向解析的本质是什么,无名和有名反向解析如 ...

  5. python读写不同编码txt文件

    python读写不同编码txt文件 以后整理规范[python] view plaincopy import os import codecs filenames=os.listdir(os.getc ...

  6. Python 文本解析器

    一.实验介绍 1.1 实验内容 讲解一个使用 Python 来解析纯文本生成一个 HTML 页面的小程序. 将学习和实践以下知识点: Python 基本语法 HTML 标记语言 1.2 实验知识点 P ...

  7. Python 批量下载SIGMOD,VLDB的论文 Mac OS

    这里写自定义目录标题 Python 批量下载SIGMOD,VLDB的论文 Mac OS 实现 0.要爬取的网站 1.下载单篇论文 2.获得所有论文的链接 完整代码 Python 批量下载SIGMOD, ...

  8. Python随笔:对 txt 文件进行读写,清除,删除操作

    Python随笔:对 txt 文件进行读写,清除内容,删除操作 文章目录 Python随笔:对 txt 文件进行读写,清除内容,删除操作 1.文件读写 1.1 读写文件前打开文件的两个方法 1.2 写 ...

  9. 【Android】oui.txt格式化的sqlite数据库文件直接导入

    oui官方地址: http://standards-oui.ieee.org/oui.txt sqlite数据库文件:http://download.csdn.net/download/u013372 ...

最新文章

  1. C#中委托与事件的使用-以Winform中跨窗体传值为例
  2. CSS的outline轮廓属性:轮廓属性
  3. 分布式系统关注点(9)——想通关「限流」?只要这一篇
  4. (最优解法)46行代码AC_HDU1242 Rescue(DFS解法+BFS解法)
  5. 使用python完成冒泡排序_python 冒泡排序优化,用递归实现冒泡排序
  6. .net Excel导出出现乱码及excel打开出现错误提示
  7. JS数组的需要注意的问题
  8. QQ2007 Beta2 下载地址泄露
  9. permutation 1(HDU-6628)
  10. mysql round 四舍五入_MySQL之ROUND函数四舍五入的陷阱
  11. django filter查询多选_django model filter查询
  12. rabbitMQ第四篇:远程调用
  13. 打包contrail-setup
  14. The Amazon Appstore is not currently available in your country
  15. python tokenize_model_python – 如何在数据框中使用word_tokenize
  16. XMPP协议的工作原理
  17. 将linux内核烧进arm板,ARM开发板上uClinux内核移植
  18. 【分布式任务调度】(三)XXL-JOB调度中心对执行器的上下线感知实现原理
  19. winpe镜像文件iso下载_教你如何使用iso文件安装系统_一键重装教程
  20. fastapi获取访客真实ip

热门文章

  1. 常微分方程第三版_常微分方程:(第六章)非线性微分方程:5节
  2. python简单圣诞树手工折纸_简单立体手工折纸圣诞树的视频教程
  3. python集合类型应用场景_python学习笔记(10)--组合数据类型(集合类型)
  4. 1599元!荣耀Play6T Pro今日首销:史上最薄5G手机!
  5. OPPO Find X5/Pro搭载一体化流线设计,采用双芯片战略
  6. 国家邮政局:春节假期全国共揽收投递快递包裹7.49亿件
  7. 宁德时代拟再投240亿元扩产宜宾基地
  8. 京东11.11晚8开启四小时累计售出商品超1.9亿件
  9. 网友疯买、雷军力撑,又一家国货站起来了!
  10. 微软将于6月24日发布下一代Windows