解析文件头信息
要读取一个二进制文件,首先要搞清楚的就是他的 文件格式,按照 byte 一个个去读取 所需要的信息即可
看下代码:
val file = File("/Users/njvivo/Desktop/company_code/forkBooster/FLATReader2/assets/test2.png.flat") val chan = FileChannel.open(file.toPath(), StandardOpenOption.READ) // 小端读 val buffer = chan.map(FileChannel.MapMode.READ_ONLY, 0, file.length()).order(ByteOrder.LITTLE_ENDIAN) // 文件头 val magic = buffer.int // 这里magic取出来是一个10进制的值 这里转成16进制就是flat的固定文件头了 println("magic:$magic ${magic.toString(16)}") // aapt2 版本 val version = buffer.int println("version:$version") // 多少个资源项 val entryCount = buffer.int println("entryCount:$entryCount") // 文件类型 val entryType = buffer.int println("entryType:$entryType") // 内容长度 long一次性读8个byte val entryLength = buffer.long println("entryLength:$entryLength") 复制代码
我们也可以看下 dexdump出来的文件
这里注意涉及到一个大小端解读的问题, 我们其实不用那么绕,只要谨记下面几个规则: