0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

二进制数据处理效率革命:ZBUFF全流程实战解析!

合宙LuatOS 来源:合宙LuatOS 作者:合宙LuatOS 2025-08-25 14:35 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

探索ZBUFF带来的数据处理效率革命,从实战案例出发,讲解如何利用ZBUFF简化二进制操作流程、优化内存使用、提升解析速度,为开发者开启高效开发新篇章。

如何高效解决嵌入式开发中的数据处理问题?

LuatOS最新应用示例提供完整的zbuff二进制数据处理库的演示,帮你快速了解在嵌入式环境中高效处理二进制数据的全流程。

一、zbuff库核心功能

zbuff是LuatOS中用于直接操作二进制内存数据的库,类似于C语言中的内存指针。

它提供以下核心功能:

动态内存管理:申请指定长度的内存空间,支持SRAM/PSRAM。

灵活读写:支持字节、整数、浮点数等数据类型的读写,如readU32()、writeF32()。

高级操作:内存拷贝(copy)、填充(set)、比较(isEqual)、Base64编码等。

帧缓冲FrameBuffer:可直接操作显示缓冲区,如设置像素pixel()、画线drawLine()。

zbuff可以在sram上或者psram上申请空间,也可以自动申请(如存在psram,则在psram进行申请;如不存在或失败,则在sram进行申请)。

操作里面的元素时,可以根据光标进行增删改查。偏移方式有三种:从头、当前位置、末尾开始。

常用参数如下:

wKgZPGir_myAYEQYAAFO4MtTAYs994.png

二、何时会用到zbuff库?

zbuff库主要用于需要高效处理原始二进制数据的场景,尤其是在嵌入式设备中。

这些场景通常具有以下特点:

数据量大:例如图像、音频、网络数据包等。

需要频繁修改:如实时数据解析、协议封装等。

内存受限:需要避免Lua字符串的不可变特性导致的内存碎片和重复拷贝。

这里列举一些场景作为参考:

2.1 网络通信协议处理

场景描述:在TCP/UDP通信中,接收到的数据包是原始的二进制流,需要按照协议解析(如MQTT、HTTP头部、自定义二进制协议)。

为什么用zbuff:网络数据包可能很大,且需要多次读写指针位置(如解析完头部后再解析内容)。使用zbuff可以避免反复创建新字符串,减少内存分配。

2.2 图像/视频数据处理

场景描述:摄像头采集的图像帧数据(如JPEG或RGB原始数据)需要处理(如裁剪、旋转、压缩)。

为什么用zbuff:一帧图像可能占用几KB到几十KB,直接使用Lua字符串处理会因不可变性导致多次拷贝,而zbuff支持原地操作,节省内存和时间。

2.3 传感器原始数据解析

场景描述:传感器(如加速度计、陀螺仪)通过I2C/SPI返回多字节原始数据(如6字节的XYZ三轴数据)。

为什么用zbuff:传感器数据通常是小而频繁的二进制流,使用zbuff的readI16()等类型化读取接口,比手动拆解字符串更高效。

三、zbuff、string、pack对比

既然已经有string/pack库了,为什么还要单独有个zbuff库呢?

wKgZPGir_quAKNe8AAHE7WG7SSs163.png


3.1 string库文本的代价

1)不可变性:无法多个变量持有同一份字符串。

如:s2=s1,会将s1中的数据复制一份放到s2中。会复制整个字符串 → 内存碎片+高延迟。

2)不能直接以数组形式操作:

如:不能使用s[1]操作,而使用s:byte(2)比较麻烦。

3)文本局限:字符串新建后就无法修改。

如:新建local s = string.char(0x01,0x02)后,字符串是无法修改的,除非再新建一个字符串赋值给变量s。

3.2 pack库结构化数据翻译

1)核心功能:解决字节序和数据类型转换。

wKgZPGir_tSAVQR4AABGchgT1pM261.png


2)依赖string:输出结果为字符串 → 再次修改需全量拷贝

3.3 需要重点强调三者的底层差异

zbuff直接操作内存块,而另外两者依赖字符串。

可以举一个实际协议解析的例子说明三者的协作关系,比如先通过zbuff接收原始数据,再用pack解析特定字段,最后用string处理文本部分。

wKgZO2ir_v6AJ9XxAAAwlbHXjR0677.png


掌握三者结合,可高效解决嵌入式开发中99%的数据处理问题。

四、zbuff应用示例

下文将以低功耗模组Air780EHV为例,分享zbuff应用示例要点。

wKgZO2ir_0GATdhkAAtJ68Ipvus437.png


最新源码及实操教程详见:https://docs.openluat.com/air780ehv/luatos/app/common/zbuff/

本demo提供一个完整的zbuff二进制数据处理库的演示,项目分为三个核心功能模块,覆盖了从基础到高级的二进制数据处理场景。

4.1 基础功能模块

zbuff_core.lua是zbuff的基础操作模块,包含zbuff最常用的创建,读写高效查询等基础功能。

01)缓冲区管理

创建固定大小(1024字节)的缓冲区zbuff.create

索引直接访问(如 buff[0] = 0xAE)

wKgZO2ir_3WAb9YzAAGl5ygP-kc291.png

02)基础IO操作

写入字符串和数值数据(write("123"))

指针控制(seek()定位操作)

数据读取(read(3))

wKgZO2ir_6mAVhhPAAMdMTGExME390.png

03)元信息查询

获取缓冲区总长度(len())

查询已使用空间(used())

wKgZPGir_9KAYWskAAEGa64sEls363.png


04)高效数据查询(query接口)

query()接口快速提取数据

自动格式转换(大端序处理)

wKgZPGir__uAbjlrAAIYSLWcZpk955.png

4.2 高级功能模块

zbuff_advanced.lua是zbuff高级操作模块,包含zbuff较为复杂的结构化打包、类型化操作等数据处理功能。

01)结构化数据处理

数据打包(pack(">IIHA", ...)):支持大端序/多种数据类型

数据解包(unpack(">IIHA10")):自动解析复合数据结构

wKgZO2isACGAFIlYAAS3qfAbLrU948.png

02)类型化操作

精确类型读写:writeI8()/readU32()等。

wKgZPGisAEeAQMCbAAKUXKfDQXc071.png

03)浮点处理

单精度浮点写入(writeF32(1.2))

浮点数据读取(readF32())

wKgZO2isAHaAI5YBAAFmUCMweQc822.png


4.3 内存管理模块

zbuff_memory.lua是内存管理模块,核心业务逻辑为内存管理操作。

01)动态内存管理

缓冲区动态扩容resize(2048)

wKgZO2isAJuAZdERAAECLcDcDF4392.png

02)块操作

内存块设置(set(10,0xaa,5))类似memset

数据删除(del(2,3))及前移

wKgZO2isAL6AO__IAAJIyZxPrMc940.png

03)数据工具

内存比较(isEqual())Base64

编码转换(toBase64())

wKgZO2isAN6AZxO7AAEZvCzikXo223.png

五、示例功能验证

Air780EHV核心板通过LuaTools烧录内核固件和demo脚本代码,烧录成功后开机运行查看运行结果。

5.1 基础功能模块 (zbuff_core.lua):

wKgZO2isARaAYzZQAAHPYYmviwY100.png


5.2 高级功能模块 (zbuff_advanced.lua):

wKgZO2isATmAALXbAAG6s1ZLtX8401.png

5.3 内存管理模块 (zbuff_memory.lua):

wKgZO2isAWCAHfKqAAFOVXK8ncA694.png

今天的内容就分享到这里了~

审核编辑 黄宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 嵌入式
    +关注

    关注

    5186

    文章

    20146

    浏览量

    328796
  • 数据处理
    +关注

    关注

    0

    文章

    642

    浏览量

    29807
收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    如何在vivado上基于二进制码对指令运行状态进行判断

    在扩展指令时我们常常需要一些手段来帮助我们判断指令是否能够成功运行、运行状态是否正确。一方面,我们可以通过模拟器来实现,另一方面,在没有模拟器的情况下,我们可以通过将所扩展指令的二进制代码导入
    发表于 10-24 06:46

    如何将图像文件转换为二进制文件?

    如何将图像文件转换为二进制文件
    发表于 09-05 08:28

    二进制数据处理方法分享

    时,我们如何去解析数据并且应用它们。本次的技术分享文章,我们就从如何传输数据解析二进制数据来一
    的头像 发表于 07-30 15:41 2150次阅读
    <b class='flag-5'>二进制</b><b class='flag-5'>数据处理</b>方法分享

    用PaddleNLP为GPT-2模型制作FineWeb二进制预训练数据

    ,使用PaddleNLP将FineWeb数据集中文本形式的数据,经过分词化(Tokenize),转换为大语言模型能直接使用的二进制数据,以便提升训练效果。 ChatGPT发布后,当代大
    的头像 发表于 03-21 18:24 3824次阅读
    用PaddleNLP为GPT-2模型制作FineWeb<b class='flag-5'>二进制</b>预训练<b class='flag-5'>数据</b>集

    如何使用Keil将二进制文件加载到外部SPI Flash中?

    我想知道是否有办法使用 Keil 将随机二进制文件加载到外部 SPI 闪存中。二进制文件将通过 LPC54102(OM13077 EVK 板)。我知道一些用于 FPGA 的 ISE 允许您执行此作
    发表于 03-17 06:37

    无法使用密度化参数构建OpenVINO™二进制,怎么处理

    无法使用密度化参数构建OpenVINO™二进制
    发表于 03-06 06:51

    74LV4060-Q100二进制纹波计数器规格书

    电子发烧友网站提供《74LV4060-Q100二进制纹波计数器规格书.pdf》资料免费下载
    发表于 02-10 14:19 0次下载
    74LV4060-Q100<b class='flag-5'>二进制</b>纹波计数器规格书

    74LV4060二进制纹波计数器规格书

    电子发烧友网站提供《74LV4060二进制纹波计数器规格书.pdf》资料免费下载
    发表于 02-10 14:14 0次下载
    74LV4060<b class='flag-5'>二进制</b>纹波计数器规格书

    74HC4520;74HCT4520同步二进制计数器规格书

    电子发烧友网站提供《74HC4520;74HCT4520同步二进制计数器规格书.pdf》资料免费下载
    发表于 02-09 11:42 0次下载
    74HC4520;74HCT4520同步<b class='flag-5'>二进制</b>计数器规格书

    74LV393双路4位二进制纹波计数器规格书

    电子发烧友网站提供《74LV393双路4位二进制纹波计数器规格书.pdf》资料免费下载
    发表于 02-08 15:55 0次下载
    74LV393双路4位<b class='flag-5'>二进制</b>纹波计数器规格书

    74HC193;74HC7193二进制加减计数器规格书

    电子发烧友网站提供《74HC193;74HC7193二进制加减计数器规格书.pdf》资料免费下载
    发表于 02-07 16:28 0次下载
    74HC193;74HC7193<b class='flag-5'>二进制</b>加减计数器规格书

    74HC191可预置同步4位二进制加减计数器规格书

    电子发烧友网站提供《74HC191可预置同步4位二进制加减计数器规格书.pdf》资料免费下载
    发表于 02-07 15:57 1次下载
    74HC191可预置同步4位<b class='flag-5'>二进制</b>加减计数器规格书

    偏移二进制二进制补码如何和实际数据对应,如何转换?

    偏移二进制二进制补码如何和实际数据对应,如何转换,请哪位高手解惑
    发表于 01-16 06:01

    TLC2543的输出结果应为带符号二进制格式的数据,现在输出的结果为不带符号的二进制数,这是因为什么原因?

    DSP采用模拟SPI总线的方式和TLC2543进行通信,采用AIN0,AIN1,AIN2,TLC2543的输出数据格式为16位,高位在前,带符号二进制数。用万用表测的AIN0,AIN1,AIN2
    发表于 12-27 07:46

    bcd编码的应用 bcd与二进制的区别

    直接对应于我们日常使用的十进制数字系统。以下是BCD编码的一些应用和它与二进制编码的区别: BCD编码的应用 数字显示设备 :在数字钟表、计算器和其他需要显示十进制数字的设备中,BCD编码可以直接用于显示数字,无需额外的转换。
    的头像 发表于 12-20 17:11 4363次阅读