xabc_lib/
header.rs

1use getset::CopyGetters;
2use std::fmt;
3
4use super::uint32_t;
5
6use scroll::Pread;
7
8/// ABC file header
9/// 12*4 + 8 + 4 = 60
10#[derive(Debug, Pread, CopyGetters, Default)]
11#[get_copy = "pub"]
12pub struct Header {
13    /// 文件头魔数,值必须是'P' 'A' 'N' 'D' 'A' '\0' '\0' '\0'。
14    magic: [u8; 8],
15    /// 字节码文件除文件头魔数和本校验字段之外的内容的 adler32 校验和。
16    checksum: [u8; 4],
17    /// 字节码文件的版本号 (Version) 。
18    version: [u8; 4],
19    /// 字节码文件的大小,以字节为单位。
20    file_size: uint32_t,
21    /// 一个偏移量,指向外部区域。外部区域中仅包含类型为 ForeignClass 或ForeignMethod的元素。foreign_off指向该区域的第一个元素。
22    foreign_off: uint32_t,
23    /// 外部区域的大小,以字节为单位。
24    foreign_size: uint32_t,
25    /// ClassIndex结构中元素的数量,即文件中定义的Class的数量。
26    classes_size: uint32_t,
27    /// 一个偏移量,指向ClassIndex。
28    class_idx_off: uint32_t,
29    /// LineNumberProgramIndex结构中元素的数量,即文件中定义的Line number program的数量。
30    num_lnps: uint32_t,
31    /// 一个偏移量,指向LineNumberProgramIndex。
32    lnp_idx_off: uint32_t,
33    /// LiteralArrayIndex 的数量
34    literalarrays_size: uint32_t,
35    /// 指向 LiteralArrayIndex 的偏移量
36    literalarray_idx_off: uint32_t,
37    /// RegionIndex 的数量
38    region_size: uint32_t,
39    /// 一个偏移量,指向第一个 RegionIndex
40    region_off: uint32_t,
41}
42
43impl fmt::Display for Header {
44    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
45        let magic = String::from_utf8_lossy(&self.magic);
46        let version = self
47            .version
48            .iter()
49            .map(|x| x.to_string())
50            .collect::<Vec<_>>()
51            .join(".");
52
53        write!(
54            f,
55            "
56magic: {}
57checksum: {:?}
58版本: {}
59文件大小: {}
60外部区域偏移: {}
61外部区域大小: {}
62类的数量: {}
63类索引的偏移: {}
64行号索引数量: {}
65行号索引偏移: {}
66字面量数组的数量: {}
67字面量数组的偏移: {}
68索引头的数量: {}
69索引头的偏移: {}
70",
71            magic,
72            self.checksum,
73            version,
74            self.file_size,
75            self.foreign_off,
76            self.foreign_size,
77            self.classes_size,
78            self.class_idx_off,
79            self.num_lnps,
80            self.lnp_idx_off,
81            self.literalarrays_size,
82            self.literalarray_idx_off,
83            self.region_size,
84            self.region_off,
85        )
86    }
87}