HarmonyOS Next 方舟字节码文件格式介绍

news2025/2/10 11:19:52

在开发中,可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中,arkts会编译成方舟字节码。方舟字节码长什么样呢?我们以一个demo编译出的abc文件:
![[HarmonyOS Next 方舟字节码文件格式介绍.png]]

二进制就是长这样,怎么去理解呢?就需要理解方舟字节码的文件格式。

字节码文件布局

上面图中看到有个可以认识的几个字母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是不同类型的数据或者为空。

字节码文件中所有的多字节值均采用小端字节序。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

WPS如何接入DeepSeek(通过JS宏调用)

WPS如何接入DeepSeek 一、文本扩写二、校对三、翻译 本文介绍如何通过 WPS JS宏调用 DeepSeek 大模型&#xff0c;实现自动化文本扩写、校对和翻译等功能。 一、文本扩写 1、随便打开一个word文档&#xff0c;点击工具栏“工具”。 2、点击“开发工具”。 3、点击“查看代码”…

【课程设计参考】迷宫小游戏 :基于 Python+Pygame+AI算法

一、内容 实现走迷宫 &#xff08;1&#xff09;游戏界面显示&#xff1a;迷宫地图、上下左右移动的特效。 &#xff08;2&#xff09;动作选择&#xff1a;上下左右键对应于上下左右的移动功能&#xff0c;遇到障碍的处理。 &#xff08;3&#xff09;得分统计功能&#xff…

sa8295 qnx ais_camare如何支持一个摄像头两路vc输出?

当一个摄像头有两个vc输出的时候&#xff0c;如何更改驱动配置呢&#xff1f; 当一个摄像头可以输出两路vc&#xff0c;并且格式不同。根据每一路的vc图像数据格式修改串行器中maxxxx_mode_t里面的数组mode参数&#xff08;以下仅为例子&#xff09; struct maxxxx_mode_t ma…

Coze(扣子)+ Deepseek:多Agents智能体协作开发新范式

前言 在当今数字化浪潮中&#xff0c;人工智能&#xff08;AI&#xff09;技术的迅猛发展正深刻改变着我们的生活和工作方式。从智能语音助手到自动化流程机器人&#xff0c;AI 的应用无处不在&#xff0c;为我们提供了更加便捷、高效的服务。然而&#xff0c;对于非专业人士来…

浅析Ruby类污染及其在Sinatra框架下的利用

和JavaScript中的原型链污染类似&#xff0c;Ruby中也存在类似的概念——类污染&#xff0c;两者都是对象进行不安全的递归合并导致的。 网上也没有相关的分析文章&#xff0c;只有下面这篇文章应该是第一次谈到这个问题 Class Pollution in Ruby: A Deep Dive into Exploiti…

【NLP251】Transformer API调用

1. nn.Transformer nn.Transformer封装了Transformer中的包含编码器&#xff08;Encoder&#xff09;和解码器&#xff08;Decoder&#xff09;。如下图所示&#xff0c;它对Encoder和Decoder两部分的包装&#xff0c;它并没有实现输入中的Embedding和Positional Encoding和最…

idea 如何使用deepseek 保姆级教程

1.安装idea插件codegpt 2.注册deepseek并生成apikey deepseek 开发平台&#xff1a; DeepSeek​​​​​​​ 3.在idea进行codegpt配置 打开idea的File->Settings->Tools->CodeGPT->Providers->Custom OpenAI Chat Completions的URL填写 https://api.deepseek…

python实现情绪识别模块,并将模块封装成可执行文件

目录&#xff1a; 1.源码&#xff1a;2.情绪识别模型运行流程&#xff1a;3.模型封装需要注意的地方&#xff1a;4.未解决问题&#xff1a; 1.源码&#xff1a; https://gitcode.com/xyint/deep_learning.git 2.情绪识别模型运行流程&#xff1a; 需要获取用户摄像头权限&…

AH比价格策略源代码

用python 获取在A股和香港上市的公司和在A股和香港上市的公司股票代码和名称并且选出港股和A股涨幅相差比较大的股票 import akshare as akdef get_ah_stocks():# 获取A股股票列表a_stock_list ak.stock_zh_a_spot_em()print(a_stock_list)a_stock_list a_stock_list[[&quo…

群晖安装Gitea

安装Docker Docker运行Gitea 上传gitea包&#xff0c;下载地址&#xff1a;https://download.csdn.net/download/hmxm6/90360455 打开docker 点击印象&#xff0c;点击新增&#xff0c;从文件添加 点击启动 可根据情况&#xff0c;进行高级设置&#xff0c;没有就下一步 点击应…

LabVIEW商业软件开发

在商业软件开发和仪器自动测试领域&#xff0c;LabVIEW以其图形化编程方式、高效的数据采集能力和强大的硬件集成优势&#xff0c;成为众多工程项目的核心开发工具。然而&#xff0c;商业软件的开发远不止编写代码和实现功能那么简单&#xff0c;尤其是在仪器自动测试领域&…

内容中台赋能人工智能技术提升业务创新能力

内容概要 在当今快速变化的市场环境中&#xff0c;企业需要不断寻求创新以保持竞争力。内容中台作为一种新型的内容管理架构&#xff0c;能够极大地提升企业在内容创建、管理和分发方面的效率。通过与人工智能技术的深度融合&#xff0c;企业能够将海量的数据和信息转化为有价…

生成式聊天机器人 -- 基于Pytorch + Global Attention + 双向 GRU 实现的SeqToSeq模型 -- 下

生成式聊天机器人 -- 基于Pytorch Global Attention 双向 GRU 实现的SeqToSeq模型 -- 下 训练Masked 损失单次训练过程迭代训练过程 测试贪心解码(Greedy decoding)算法实现对话函数 训练和测试模型完整代码 生成式聊天机器人 – 基于Pytorch Global Attention 双向 GRU 实…

Netty初学九 心跳与空闲检测

一、网络问题 1.连接假死&#xff1a; 连接假死的现象是&#xff1a;在某一端看来&#xff0c;底层的Tcp连接已经断开&#xff0c;但是应用程序没有捕获到&#xff0c;会认为这条连接仍然是存在的。从TCP层面来说&#xff0c;只有收到四次握手数据包或者一个RST数据包才可以表示…

数据分析如何做EDA

探索性数据分析&#xff08;EDA&#xff0c;Exploratory Data Analysis&#xff09;是数据分析过程中至关重要的一步&#xff0c;其目的是通过统计和可视化技术对数据进行初步分析&#xff0c;从而揭示数据的潜在模式、特征和异常值&#xff0c;并为后续的数据预处理、特征工程…

AD域控粗略了解

一、前提 转眼大四&#xff0c;目前已入职上饶一公司从事运维工程师&#xff0c;这与我之前干的开发有着很大的差异&#xff0c;也学习到了许多新的知识。今天就写下我对于运维工作中常用的功能——域控的理解。 二、为什么要有域控&#xff0c;即域控的作用 首先我们必须要…

【计算机网络】TCP/IP 网络模型有哪几层?

目录 应用层 传输层 网络层 网络接口层 总结 为什么要有 TCP/IP 网络模型&#xff1f; 对于同一台设备上的进程间通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;而对于不同设备上的进程间通信&#xff0c;就需要网络通…

【Flink实战】Flink -C实现类路径配置与实现UDF Jar

文章目录 1. 描述2. 使用语法3. -C 适用的 Flink 运行模式4. USING JAR 不可用 1. 描述 Flink 中的 -C 选项用于将 URL 添加到作业的类加载器中。URL可以指向本地、HTTP 服务器或 HDFS 等资源的Jar文件。 注意&#xff1a; 此处的classpath的url必须是一个能够在client&…

【东莞常平】戴尔R710服务器不开机维修分享

1&#xff1a;2025-02-06一位老客户的朋友刚开工公司ERP服务器一台戴尔老服务器故障无法开机&#xff0c;于是经老客户介绍找到我们。 2&#xff1a;服务器型号是DELL PowerEdge R710 这个服务器至少也有15年以上的使用年限了。 3&#xff1a;客户反馈的故障问题为&#xff1a;…

STM32自学记录(八)

STM32自学记录 文章目录 STM32自学记录前言一、ADC杂记二、实验1.学习视频2.复现代码 总结 前言 ADC 一、ADC杂记 ADC其实就是一个电压表&#xff0c;把引脚的电压值测出来&#xff0c;放在一个变量里。 ADC&#xff1a;模拟——数字转换器。 ADC可以将引脚上连续变化的模拟电…