网站共享备案可以申请支付接口,wordpress实时刷新模块,网站 移动化,温岭企业网站建设公司在开发中#xff0c;可读的编程语言要编译成二进制的字节码格式才能被机器识别。在HarmonyOS Next开发中#xff0c;arkts会编译成方舟字节码。方舟字节码长什么样呢#xff1f;我们以一个demo编译出的abc文件#xff1a;
二进制就是长这样#xff0c;怎么去理解呢…在开发中可读的编程语言要编译成二进制的字节码格式才能被机器识别。在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码接下来是三个0checksum四个字节的校验位0x5d、0xe8、0xde、0xdfversion自个字节的版本号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是不同类型的数据或者为空。
字节码文件中所有的多字节值均采用小端字节序。