PyQt实战——使用python提取JSON数据(十)

系类往期文章:
PyQt5实战——多脚本集合包,前言与环境配置(一)
PyQt5实战——多脚本集合包,UI以及工程布局(二)
PyQt5实战——多脚本集合包,程序入口QMainWindow(三)
PyQt5实战——操作台打印重定向,主界面以及stacklayout使用(四)
PyQt5实战——UTF-8编码器UI页面设计以及按钮连接(五)
PyQt5实战——UTF-8编码器功能的实现(六)
PyQt5实战——翻译器的UI页面设计以及代码实现(七)
PyQt5实战——翻译的实现,第一次爬取微软翻译经验总结(八)
PyQt5实战——翻译的实现,成功爬取微软翻译(可长期使用)经验总结(九)

前言

距离上次更新PyQt实战系列隔了好久,因为现实中比较忙,而且确实是存货已经用完,现在对脚本集合包更新了一些新的内容,包括:JSON数据的处理,ADPCM音频编解码,PCM二进制文件构建以及PCM音频播放功能,此外,还有一个数据加密解密算法,与笔者之前的文章《逆向工程实战,在反汇编工具中理解汇编与伪C》中的算法一致,是笔者在反汇编的学习中无意间发现的一种数据加密算法,简单且有效,当初逆向该算法时花了不少时间,总之,这些内容后续都会讲到!

JSON数据处理UI

本功能的UI设计十分简单,用到的全是PyQt5实战系列提及过的内容,因此本文将不再重复讲解UI界面的代码,但是代码依然会贴出来,如下:

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtSvg import *

from component.btnStyle import *
from component.editStyle import *
from component.getPath import *
from tools.wiresharckJsonProcess import *


class WwiresharkJsonProc(QWidget):
    def __init__(self):
        super().__init__()
        self.filePaths = ['']
        self.initUI()

    def initUI(self):
        self.JsonProcesslayout = QVBoxLayout()
        self.setLayout(self.JsonProcesslayout)
        # 文件选择
        self.filelayout = QHBoxLayout()
        self.lable = QLabel("请选择文件",self)
        self.filelayout.addWidget(self.lable)
        self.input = QLineEdit(self)
        LineEditStyle(self.input)
        self.filelayout.addWidget(self.input)
        self.choosebtn = QPushButton("选择文件",self)
        btnReleaseStyleA(self.choosebtn)
        self.choosebtn.clicked.connect(self.getpath)
        self.filelayout.addWidget(self.choosebtn)
        self.JsonProcesslayout.addLayout(self.filelayout)
        
        # 开始处理
        self.exebtn = QPushButton("开始处理",self)
        btnReleaseStyleA(self.exebtn)
        self.exebtn.clicked.connect(self.exebtn_press_clicked)
        self.JsonProcesslayout.addWidget(self.exebtn)

    def getpath(self):
        get_path(self)
        self.input.setText(self.filePaths[0])
        
    def exebtn_press_clicked(self):
        processJson(self.filePaths[0])

界面非常简单,如下所示

请添加图片描述

可以看到,在这个页面下仅有一个文件选择的组件加上一个处理的按钮。非常简单的一个页面设计,本文的重点并不在这个UI设计上,而是在wireshark的抓包数据转换成JSON格式以及python提取JSON数据。

JSON数据的来源

本文所使用的JSON数据来源于wireshark抓包,wireshark是一个网络封包分析工具,可以截取各种网络数据包,并显示数据包中的各种详细信息,常用于开发测试过程中的问题定位。但笔者并不是用wireshark来处理网络封包,而是处理低功耗蓝牙(BLE)的封包。wireshark本身并没有捕获BLE数据包的能力,但是结合特殊的dongle可以,使用NRF52832 BLE Sniffer低功耗蓝牙抓包器可以捕捉到到低功耗蓝牙的空中数据,非常实用,感兴趣的同学可以在网上查询相关信息,本文不做赘述。

这里笔者对一个数据包做了筛选,如下图所示,从机通过notify的形式向主机传递消息,消息通过handle值为0x97的特征传递给主机,这里不了解蓝牙的同学可以不用理会,以后笔者会单独出一个蓝牙系列,分享笔者的蓝牙知识。

请添加图片描述

在下面详细信息中可以看到,所选中的这一条数据,是从机通过handle0x97的特征,向主机发送共计120个字节的value数据:3b 18 01 ....... 04 d1 1a,如果手动一条一条数据中蓝色框框的内容复制出来是非常耗时的,可以采用以下方式获取数据:

文件 → 导出分组解析结果 → As JSON

请添加图片描述

可以导出JSON格式的数据,我们展示一下JSON数据

[
  {
    "_index": "packets-2024-12-06",
    "_type": "doc",
    "_score": null,
    "_source": {
      "layers": {
        "frame": {
          "frame.section_number": "1",
          "frame.interface_id": "0",
          "frame.interface_id_tree": {
            "frame.interface_name": "COM30-4.0",
            "frame.interface_description": "nRF Sniffer for Bluetooth LE COM30"
          },
          "frame.encap_type": "186",
          "frame.time": "Dec  6, 2024 11:19:43.491844000 中国标准时间",
          "frame.offset_shift": "0.000000000",
          "frame.time_epoch": "1733455183.491844000",
          "frame.time_delta": "0.000231000",
          "frame.time_delta_displayed": "0.000000000",
          "frame.time_relative": "62.812024000",
          "frame.number": "12534",
          "frame.len": "53",
          "frame.cap_len": "53",
          "frame.marked": "0",
          "frame.ignored": "0",
          "frame.protocols": "nordic_ble:btle:btl2cap:btatt"
        },
        "nordic_ble": {
          "nordic_ble.board_id": "30",
          "nordic_ble.header": {
            "nordic_ble.plen": "46",
            "nordic_ble.protover": "3",
            "nordic_ble.packet_counter": "36765",
            "nordic_ble.packet_id": "6"
          },
          "nordic_ble.len": "10",
          "nordic_ble.flags": "0x0d",
          "nordic_ble.flags_tree": {
            "nordic_ble.crcok": "1",
            "nordic_ble.direction": "0",
            "nordic_ble.encrypted": "1",
            "nordic_ble.micok": "1",
            "nordic_ble.phy": "0",
            "nordic_ble.flag_reserved7": "0"
          },
          "nordic_ble.channel": "29",
          "nordic_ble.rssi": "-45",
          "nordic_ble.event_counter": "1158",
          "nordic_ble.time": "1172995411",
          "nordic_ble.packet_time": "296",
          "nordic_ble.delta_time": "151",
          "nordic_ble.delta_time_ss": "231"
        },
        "btle": {
          "btle.access_address": "0x27353836",
          "btle.master_bd_addr": "90:e4:68:a8:41:7c",
          "btle.slave_bd_addr": "00:00:00:08:47:2c",
          "btle.data_header": {
            "btle.data_header.llid": "0x02",
            "btle.data_header.next_expected_sequence_number": "1",
            "btle.data_header.sequence_number": "0",
            "btle.data_header.more_data": "1",
            "btle.data_header.cte_info_present": "0",
            "btle.data_header.rfu": "0",
            "btle.data_header.length": "27"
          },
          "btle.length": "27",
          "btle.l2cap_index": "132",
          "btle.connection_parameters_in": "11696",
          "btle.crc": "0xe3cc46"
        },
        "btl2cap": {
          "btl2cap.length": "23",
          "btl2cap.cid": "0x0004"
        },
        "btatt": {
          "btatt.opcode": "0x1b",
          "btatt.opcode_tree": {
            "btatt.opcode.authentication_signature": "0",
            "btatt.opcode.command": "0",
            "btatt.opcode.method": "0x1b"
          },
          "btatt.handle": "0x0036",
          "btatt.handle_tree": {
            "btatt.service_uuid16": "0x1812"
          },
          "btatt.value": "60:d8:4b:d4:62:66:d9:d5:4c:d5:5f:d6:d3:5d:63:da:64:d7:61:d8"
        }
      }
    }
  },

这么长的数据,仅仅wireshark中展示的一条数据,而我们需要的数据,仅仅是btatt.value这一个属性

"btatt.value": "60:d8:4b:d4:62:66:d9:d5:4c:d5:5f:d6:d3:5d:63:da:64:d7:61:d8"

而敏锐的同学可以发现,此JSON文件的开头,是[,也就是说,此JSON文件的框架是[{第一条数据},{第二条数据}....{第n条数据}...],这种格式非常适合python通过list数据结构进行处理。

JSON数据提取

先来观察我们需要的目标数据,btatt.value,这是由多层字典嵌套在其中的,因此要依次往上查找不同层级的字典,可以发现:

  • __source
  • layers
    • btatt
      • btatt.value

是这样的一个结构。

我们现在来看代码

import json

def processJson(filename):
    with open(filename, "r", encoding="utf-8") as f:
        attvalue = json.load(f)
        for i in range(len(attvalue)):
            voicevalue = attvalue[i]["_source"]["layers"]["btatt"]["btatt.value"] + "\n"
            with open("workspaces/VoiceData.txt", "a", encoding="utf-8") as f:
                f.write(voicevalue)
        print("line len: ",len(voicevalue))
        print("line count: ",len(attvalue))
        # print(data)

我们来分析一下代码:

  • filename这个文件中读取数据,以utf-8编码格式解码
  • json.load(f)是指从f中读取数据JSON数据,解析并返回对应的Python对象(例如,字典,列表等,具体取决于JSON的结构),通过我们上面的分析,此json会被解析成python的列表(因为最外层是[])。
  • 循环读取attvalue列表对象
  • 读取attvallue列表中第i个元素中的layers字典中的btatt字典中的btatt.value所对应的值,并加上一个换行符/n,最后复制给voicevalue
  • voicevalue写进workspaces/VoiceData.txt文件的末尾,a表示在文件末尾写入东西,而不覆盖原来的内容。
  • 当将所有的内容都写完时,返回每条数据的数据量以及数据总量

该方法被单独写在wiresharckJsonProcess.py文件中,存放在tools目录下,被UI页面通过import以模块导入的形式使用。

总结

本文的内容并不复杂,主要是如何从wireshark中导出JSON数据,以及如何使用python对数据进行过滤和处理,JSON是非常常用的数据传输和保存格式尤其在网络中非常常用,因此熟练的掌握看懂和处理对程序员来说是值得的,而且并不难不是吗,祝你变得更强!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/943203.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

51单片机学习笔记——找不到REG52.H头文件,点亮一个LED

创建工程 将STC型号导入keil并使用 STC可以从官网下载,也可我这的网盘: 链接:https://pan.baidu.com/s/1bO85DPN3IFaXGhiKSwyOrA?pwd7f4h 提取码:7f4h 打开STC,选择“keil仿真设置”,选择“添加型号和头…

windows和mac共享文件夹访问教程

mac共享文件夹,windows访问: mac上开启文件夹共享,并添加文件夹和用户,然后windows 上 在windows上快捷键 win r 打开运行,按如下格式输入mac设备的IP地址: 就可以访问了: windows共享文件夹…

webauthn介绍及应用

1、webauthn介绍 官网:https://webauthn.io/ 1.1、什么是webauthn? webauthn即Web Authentication,是一个符合W3C标准的Web认证规范。它通过公私钥加密技术,实现无密码认证,用户仅需通过pin码、指纹、面部识别、usb …

iOS AccentColor 和 Color Set

AccentColor 和 Color Set 都是 Xcode 中用于颜色管理的功能,它们适用于不同的开发场景和需求。以下是它们的区别和应用场景分析: 1. AccentColor(强调色) 1.1 概念: • AccentColor 是在 Xcode 12 中引入的&#xf…

TiDB 的MPP架构概述

MPP架构介绍: 如图,TiDB Server 作为协调者,首先 TiDB Server 会把每个TiFlash 拥有的region 会在TiFlash上做交换,让表连接在一个TiFlash上。另外 TiFlash会作为计算节点,每个TiFlash都负责数据交换,表连接…

git回退指定版本/复制提交id

1.使用“git reset --hard 目标版本号”命令将版本回退2.使用“git push -f”提交更改 因为我们回退后的本地库HEAD指向的版本比远程库的要旧,此时如果用“git push”会报错。 改为使用 git push -f 即可完成回退后的提交。

本地部署 LLaMA-Factory

本地部署 LLaMA-Factory 1. 本地部署 LLaMA-Factory2. 下载模型3. 微调模型3-1. 下载数据集3-2. 配置参数3-3. 启动微调3-4. 模型评估3-5. 模型对话 1. 本地部署 LLaMA-Factory 下载代码, git clone https://github.com/hiyouga/LLaMA-Factory.git cd LLaMA-Facto…

BLE core 内容整理解释

本文内容比较杂散,只是做记录使用,后续会整理的有条理些 link layer 基本介绍 **Link Layer Control(链路层控制)**是蓝牙低功耗(BLE)协议栈的核心部分,负责实现设备间可靠、安全、低功耗的数…

HEIC 是什么图片格式?如何把 iPhone 中的 HEIC 转为 JPG?

在 iPhone 拍摄照片时,默认的图片格式为 HEIC。虽然 HEIC 格式具有高压缩比、高画质等优点,但在某些设备或软件上可能存在兼容性问题。因此,将 HEIC 格式转换为更为通用的 JPG 格式就显得很有必要。本教程将介绍如何使用简鹿格式工厂&#xf…

黑马商城项目—服务注册、服务发现

服务注册 我们把item-service注册到Nacos,步骤如下: 1.引入依赖 在item-service的pom.xml中添加依赖: 2.配置Nacos 在item-service的application.yml中添加nacos地址配置: 3.配置服务实例 为了测试一个服务多个实例的情况,我…

如何卸载和升级 Angular-CLI ?

Angular-CLI 是开发人员使用 Angular 的必备工具。然而,随着频繁的更新和新版本的出现,了解如何有效地卸载和升级 Angular-CLI 对开发人员来说至关重要。本指南提供了一个全面的、循序渐进的方法来帮助您顺利过渡到最新版本。 必备条件 确保您的系统上…

有道云笔记批量导出

前言 最近使用有道云笔记遇到打开过慢,导致笔记丢失,需要会员才能找回之前笔记问题。 决定改用思源,程序中的格式比较难于通过复制保留,即使导出成word 或者pdf,需要一个专门工具导出成Markdown格式,批量…

设计模式与游戏完美开发(2)

更多内容可以浏览本人博客:https://azureblog.cn/ 😊 该文章主体内容来自《设计模式与游戏完美开发》—蔡升达 第二篇 基础系统 第四章 游戏主要类——外观模式(Facade) 一、游戏子功能的整合 一个游戏程序常常由内部数个不同的…

学习C++:变量

变量: 作用:给一段指定的内存空间起名,方便操作这段内容 (变量存在的意义:方便我们管理内存空间) 语法:数据类型 变量名 初始值; 实例:

electron-vite_18 设置系统音量loudness报错

loudness是一款控制系统音量输出的一款 Node.js 库;但是在electron-vite中直接使用编译的时候会报错;这个时候需要单独处理; 错误分析 error Error: spawn E:\xxx\out\main\adjust_get_current_system_volume_vista_plus.exe 查看编译后项目…

Chrome被360导航篡改了怎么改回来?

一、Chrome被360导航篡改了怎么改回来? 查看是否被360主页锁定,地址栏输入chrome://version,看命令行end后面(蓝色部分),是否有https://hao.360.com/?srclm&lsn31c42a959f 修改步骤 第一步&#xff1a…

微信小程序-基于Vant Weapp UI 组件库的Area 省市区选择

Area 省市区选择,省市区选择组件通常与 弹出层 组件配合使用。 areaList 格式 areaList 为对象结构,包含 province_list、city_list、county_list 三个 key。 每项以地区码作为 key,省市区名字作为 value。地区码为 6 位数字,前两…

如何用gpt来分析链接里面的内容(比如分析论文链接)和分析包含多个文件中的一块代码

如何用gpt来分析链接里面的内容,方法如下 这里使用gpt4里面有一个网路的功能 点击搜索框下面这个地球的形状即可启动搜索网页模式 然后即可提出问题在搜索框里:发现正确识别和分析了链接里面的内容 链接如下:https://arxiv.org/pdf/2009.1…

GitLab的卸载与重装

目录 一、GitLab的卸载 二、 GitLab的安装与配置 1. 创建安装目录 2. 安装 3. 使用 3.1 初始化 3.2 创建空白项目 ​编辑 3.3 配置SSH 3.3.1 配置公钥 ​编辑 3.3.2 配置私钥 3.4 配置本地git库 一、GitLab的卸载 1. 停止gitlab sudo gitlab-ctl stop 2. 卸载…

中文学习系统:成本效益分析与系统优化

2.1 SSM框架介绍 本课题程序开发使用到的框架技术,英文名称缩写是SSM,在JavaWeb开发中使用的流行框架有SSH、SSM、SpringMVC等,作为一个课题程序采用SSH框架也可以,SSM框架也可以,SpringMVC也可以。SSH框架是属于重量级…