本文借鉴《自己动手实现Lua:虚拟机、编译器和标准库》,算是对自己学习的总结,也希望分享下所学知识~~

lua的二进制chunk和java的class文件类似
本质上也是一个字节流

注意:
1.二进制chunk没有考虑跨平台的需求,对于需要使用超过一个字节表示的数据,表需要考虑大小端(Endianness)的问题
2.二进制chunk格式的设计也没有考虑过不同Lua版本之间的兼容问题。当编译Lua脚本时,直接按照当时的Lua版本生成二进制chunk文件,当加载二进制chunk文件时,会检查被夹在文件的版本号,如果和当前Lua版本不匹配,则拒绝加载
3.二进制chunk文件并不紧凑,一些情况下Lua被编译成二进制chunk之后,甚至会比文本格式的原文件还要大。因为其主要的目的是获得的更快的加载速度

数据格式:
二进制chunk内部使用的数据类型大致可分为数字、字符串和列表三种
(因为Lua是用C语言写的,所以C语言的一些数据类型会直接反映在二进制chunk的格式里)

1.数字
主要有五种:
a.字节**(占用字节:1)**
主要是存放一些比较小的整数值,比如Lua版本号、函数的参数个数等
b.C语言整形(cint)(占用字节:4)
主要用来表示列表长度
c.C语言size_t类型(size_t: [typedef unsigned long size_t])(占用字节:8)
主要用来表示长字符串长度
d.Lua整型**(占用字节:8)**
e.Lua浮点数**(占用字节:8)**
这俩主要在常量表出现,记录Lua脚本中出现整数和浮点数字面亮

数字类型在二进制chunk里都按照固定长度存储

2.字符串
字符串在二进制chunk里,其实就是一个字节数组
字符串长度是不固定的,所以需要把字节数组的长度也记录到二进制chunk里

字符串类型可以根据短字符串和长字符串进行进一步优化
a.对于NULL字符串,只用0x00表示就可以了
b.对于长度小于等于253(0xFD)的字符串,先使用一个字节记录长度+1,然后是字节数组(2^8=256,4位存长度,剩下253位可以存字符串)
c.对于长度大雨等于254(0xFE),后面跟一个size_t记录长度+1,最后是字节数组

3.列表
在二进制chunk内部,指令表、常量表、子函数原型表等信息都是按照列表的方式存储的
列表其实就是:先用一个cint类型记录列表长度,然后紧接着存储n个列表元素

chunk的数据格式相关推荐

  1. 【Android 安装包优化】资源混淆 ( resources.arsc 资源映射表文件格式 | 头文件 数据格式 | 全局字符串池 数据格式 | 包数据 数据格式 | 包头 数据格式 )

    文章目录 一.resources.arsc 资源映射表文件格式 二.头文件 数据格式 三.全局字符串池 数据格式 四.包数据 数据格式 1.包头 数据格式 2.资源类型字符串池 数据格式 3.资源名称 ...

  2. Influxdb安装、启动influxdb控制台、常用命令、Influx命令使用、Influx-sql使用举例、Influxdb的数据格式、Influxdb客户端工具

    目录: Influxdb安装 1 1.1. Influxdb下载 2 1.2. 解压tar包 2 1.3. 修改配置文件 2 1.4. 配置文件参数说明 3 1.5. 实际配置(主要是修改路径和端口) ...

  3. HTTP协议中你必须知道的三种数据格式

    实习中的一个主要工作就是分析 HTTP 中的协议,自己也用 Python 写过正则表达式对 HTTP 请求和响应的内容进行匹配,然后把关键字段抽离出来放到一个字典中以备使用(可以稍微改造一下就是一个爬 ...

  4. 05 RTMP Chunk Stream

    RTMP块流 本节指定实时消息传递协议区块流(RTMP区块流).它为更高级的多媒体流协议提供多路复用和分组服务. 虽然RTMP区块流设计用于与实时消息协议(第6节)配合使用,但它可以处理发送消息流的任 ...

  5. wave文件(*.wav)格式、PCM数据格式介绍

    音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ 16bit stereo: 每秒钟有 44100 次采样, ...

  6. 嵌入式 wave文件(*.wav)格式、PCM数据格式收藏

    1.音频简介 经常见到这样的描述: 44100HZ16bit stereo 或者 22050HZ 8bit mono 等等. 44100HZ16bit stereo: 每秒钟有 44100 次采样, ...

  7. Http提交数据格式与Spring获取参数知识点整理

    Http Content-Type 1. About 在HTTP 1.1规范中,HTTP请求方式有OPTIONS.GET.HEAD.POST.PUT.DELETE.TRACE.CONNECT 通常我们 ...

  8. express 解析post请求的数据格式

    node.js依赖express解析post请求四种数据格式 请求的格式分为: www-form-urlencoded form-data application/json text/xml 1.ww ...

  9. .wav文件详解,PCM数据格式,.wav生成C语言数组

    .WAV文件,PCM数据 1. 音频简介 经常见到这样的描述: 44100HZ 16bit stereo 或者 22050HZ 8bit mono 等等.44100HZ 16bit stereo: 每 ...

  10. OFRecord 数据格式

    OFRecord 数据格式 深度学习应用需要复杂的多阶段数据预处理流水线,数据加载是流水线的第一步,OneFlow 支持多种格式数据的加载,其中 OFRecord 格式是 OneFlow 原生的数据格 ...

最新文章

  1. java tomcat mysql_java+tomcat+mysql实现登录界面基本思路
  2. 计算机系统的可靠性可以用什么来表示,系统分析师考试计算机系统的可靠性指标...
  3. datatable中某一列最小值_获取DataTable 某一列所有值
  4. [渝粤教育] 西南科技大学 英语语法1 在线考试复习资料
  5. python实现拆分、合并、删除pdf
  6. 在Linux添加网卡,Centos(RHEL) 6 添加网卡的方法
  7. php核心技术与最佳实践 --- 错误与异常
  8. SQLServer性能优化专题
  9. Android-关于屏幕适配的一些经验
  10. Linux环境变量配置【转】
  11. Android获取应用签名
  12. java读取json文件
  13. Yarn的资源管理机制
  14. 自动获取win10锁屏壁纸脚本
  15. rust program英文和汉语混合笔记(2)
  16. arm linux 关闭防火墙,linux的防火墙及arm与虚拟机共享
  17. JVM设置对象直接进入年老代
  18. UnicodeEncodeError: 'ascii' codec can't encode character '\u2013'
  19. 关于safiry开启无痕浏览时本地存储的处理
  20. android QCN备份还原方法

热门文章

  1. Gson解析遇到的异常分析与记录
  2. RabbitMQ虚拟主机
  3. php批量mp3转换,flac转mp3软件,支持批量flac转mp3
  4. STM8S自学笔记-001 STM8简介
  5. 输入一个大写字母,显示三角形
  6. CSS第三章:10.调整字体:字体加粗;(持续更新)
  7. 使用win10自带的微软远程桌面,远程控制不同局域网的电脑【无需公网IP、无需进入路由器】
  8. UVa 12118 Inspector's Dilemma
  9. 苹果公司为什么储备那么多现金?
  10. anaconda conda 切换为国内源