论坛
潜水/灌水快乐,沉淀知识,认识更多同行。
ToB圈子
加入IT圈,遇到更多同好之人。
朋友圈
看朋友圈动态,了解ToB世界。
ToB门户
了解全球最新的ToB事件
博客
Blog
排行榜
Ranklist
文库
业界最专业的IT文库,上传资料也可以赚钱
下载
分享
Share
导读
Guide
相册
Album
记录
Doing
搜索
本版
文章
帖子
ToB圈子
用户
免费入驻
产品入驻
解决方案入驻
公司入驻
案例入驻
登录
·
注册
只需一步,快速开始
账号登录
立即注册
找回密码
用户名
Email
自动登录
找回密码
密码
登录
立即注册
首页
找靠谱产品
找解决方案
找靠谱公司
找案例
找对的人
专家智库
悬赏任务
圈子
SAAS
IT评测·应用市场-qidao123.com
»
论坛
›
软件与程序人生
›
移动端开发
›
鸿蒙
›
HarmonyOS Next 方舟字节码文件格式先容
HarmonyOS Next 方舟字节码文件格式先容
张裕
金牌会员
|
2025-2-22 20:06:53
|
显示全部楼层
|
阅读模式
楼主
主题
670
|
帖子
670
|
积分
2010
在开辟中,可读的编程语言要编译成二进制的字节码格式才能被呆板识别。在HarmonyOS Next开辟中,arkts会编译成方舟字节码。方舟字节码长什么样呢?我们以一个demo编译出的abc文件:
二进制就是长这样,怎么去理解呢?就需要理解方舟字节码的文件格式。
字节码文件结构
上面图中看到有个可以熟悉的几个字母PANDA,什么意思呢?先了解下字节码文件结构。
字节码文件起始于Header结构。文件中的全部结构均可以从Header出发,直接或间接地访问到。字节码文件中结构的引用方式包罗偏移量和索引。偏移量是一个32位长度的值,表现当前结构的起始位置在字节码文件中相对于文件头的间隔,从0开始计算。索引是一个16位长度的值,表现当前结构在索引区域中的位置。
Header
先来看看Header结构:
名称
格式
说明
magicuint8_t[8]文件头魔数,值必须是’P’ ‘A’ ‘N’ ‘D’ ‘A’ ‘\0’ ‘\0’ ‘\0’。checksumuint32_t字节码文件除文件头魔数和本校验字段之外的内容的adler32校验和。versionuint8_t[4]字节码文件的版本号 (Version) 。file_sizeuint32_t字节码文件的大小,以字节为单元。foreign_offuint32_t一个偏移量,指向外部区域。外部区域中仅包含范例为ForeignClass或ForeignMethod的元素。foreign_off指向该区域的第一个元素。foreign_sizeuint32_t外部区域的大小,以字节为单元。num_classesuint32_tClassIndex结构中元素的数量,即文件中定义的Class的数量。class_idx_offuint32_t一个偏移量,指向ClassIndex。num_lnpsuint32_tLineNumberProgramIndex结构中元素的数量,即文件中定义的Line number program的数量。lnp_idx_offuint32_t一个偏移量,指向LineNumberProgramIndex。reserveduint32_t方舟字节码文件内部使用的保存字段。reserveduint32_t方舟字节码文件内部使用的保存字段。num_index_regionsuint32_tIndexSection结构中元素的数量,即文件中IndexHeader的数量。index_section_offuint32_t一个偏移量,指向IndexSection。
magic:最开始的0x50、0x41、0x4e、0x44、0x41对应的就是PANDA的ASCII码,接下来是三个0
checksum:四个字节的校验位0x5d、0xe8、0xde、0xdf
version:自个字节的版本号0x0C、0x00、0x06、0x00
…
Version
字节码版本号由4个部分组成,格式为:主版本号.次版本号.特性版本号.编译版本号。
名称
格式
说明
主版本号uint8_t标识整体架构调解引入的字节码文件格式变更。次版本号uint8_t标识局部架构调解或者庞大特性调解引入的字节码文件格式变更。特性版本号uint8_t标识中小特性引入的字节码文件格式变更。编译版本号uint8_t标识缺陷修复引入的字节码文件格式变更。
ForeignClass
形貌字节码文件中的外部类。外部类在其他文件中声明,并在当前字节码文件中被引用。
名称
格式
说明
nameString外部类的名称,命名遵循TypeDescriptor语法。
ForeignMethod
形貌字节码文件中的外部方法。外部方法在其他文件中声明,并在当前字节码文件中被引用。
名称
格式
说明
class_idxuint16_t一个指向该方法所附属的类的索引,指向一个在ClassRegionIndex中的位置,该位置的值是一个指向Class或ForeignClass的偏移量。reserveduint16_t方舟字节码文件内部使用的保存字段。name_offuint32_t一个偏移量,指向字符串,表现方法名称。index_datauleb128方法的MethodIndexData数据。通过ForeignMethod的偏移量,可以找到适当的IndexHeader以剖析class_idx。 别的还有Class、Class、ClassAccessFlag、ClassTag、Field、FieldTag、Method、MethodIndexData、MethodTag、Code、TryBlock、CatchBlock、Annotation、AnnotationElementTag、AnnotationElement、Value formats、LineNumberProgramIndex、DebugInfo、IndexSection、IndexHeader、ClassRegionIndex、Type、MethodStringLiteralRegionIndex、LiteralArray、Literal,这里不一一先容。
接下来先容下字节码文件数据范例。
字节码文件数据范例
整型
名称
说明
uint8_t8-bit无符号整数。uint16_t16-bit无符号整数,接纳小端字节序。uint32_t32-bit无符号整数,接纳小端字节序。uleb128leb128编码的无符号整数。sleb128leb128编码的有符号整数。
字符串
名称
格式
说明
utf16_lengthuleb128值为len << 1 | is_ascii,其中len是字符串在UTF-16编码中的大小,is_ascii标志该字符串是否仅包含ASCII字符,大概的值是0或1。datauint8_t[]以’\0’末端的MUTF-8编码字符序列。
TaggedValue
名称
格式
说明
taguint8_t表现数据种类的标志。datauint8_t[]根据不同的标志,data是不同范例的数据或者为空。 字节码文件中全部的多字节值均接纳小端字节序。
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
本帖子中包含更多资源
您需要
登录
才可以下载或查看,没有账号?
立即注册
x
回复
使用道具
举报
0 个回复
倒序浏览
返回列表
快速回复
高级模式
B
Color
Image
Link
Quote
Code
Smilies
您需要登录后才可以回帖
登录
or
立即注册
本版积分规则
发表回复
回帖并转播
回帖后跳转到最后一页
发新帖
回复
张裕
金牌会员
这个人很懒什么都没写!
楼主热帖
AI绘画Stable Diffusion Lora模子的利 ...
什么时候用C而不消C++?
Linux安装最新版Docker完整教程(建议 ...
049-WEB攻防-文件上传&存储安全&OSS对 ...
京准电钟:GPS北斗卫星时钟同步系统行 ...
linux企业版火绒(火绒终端安全管理体 ...
ESP32 IDF开发 应用篇⑭ Wifi TCP客户 ...
复杂度(上卷)
LLaMa系列模子详解(原理介绍、代码解 ...
# 云计算的崛起与未来发展趋势 云计算 ...
标签云
运维
CIO
存储
服务器
浏览过的版块
移动端开发
前端开发
快速回复
返回顶部
返回列表