文件解析笔记
工具
基础知识
数据类型 | 子节数 | 说明 |
---|---|---|
byte | 1 | 占 8 个二进制字符,特殊知识:以 0x80 为分界 |
sbyte | 1 | 占 8 个二进制字符 |
short | 2 | |
ushort | 2 | |
int | 4 | |
uint | 4 | |
float | 4 | |
long | 8 | |
ulong | 8 | |
double | 8 | |
char | 1 、 2 | 在 c 等低级语言中占 1 个子节,在 c# 等高级语言中占 2 子节 |
string | 无固定长度 | 一种是定义长度,再取长度的字节数转,另一种是以 0x0 为结束符 |
leb128 | 无固定长度 | 每次读一个子节, 子节值大于等于 0x80 表示有需要读下一个子节 |
端
主要为大端小端,主要是指有多个固定字节数的数据类型的字节写入顺序不同, byte
sbyte
只有一个字节,没有大小端之分;string
char
leb128
都不固定长度,依赖前一个字节指示是否有下一个字节,所以无法分大小端。
大端(BigEndian, 简写BE),高位写在前面,反转过来写的意思,例如 (ushort)1
转成字节数组是 [0x1, 0x0]
写入流时是先写 0x0
在写入 0x1
小端(LittleEndian, 简写LE),低位写在前面,顺着字节数组写的意思,例如 (ushort)1
转成字节数组是 [0x1, 0x0]
写入流时是先写 0x1
在写入 0x0
一般来说:网络字节流的是大端,计算机文件流是小端。
字符串编码
Unicode
固定文件头 0xFF 0xFE,大端则是 0xFE 0xFF
UTF8
分有头和无头,有固定头 0xEF 0xBB 0xBF
无头编码,主要根据 char
(两个字节) 存储方式判断,一般来说 0x0-0x7F 是指占用一个字节,0x80-0xFF 根据定义可以指示多个字节
UTF8
字节数 | 字节分布 |
---|---|
1 | 0x00-0x7F |
2 | 0xC2-0xDF 0x80-0xBF |
3 | 0xE0 0xA0-0xBF 0x80-0xBF |
3 | 0xE1-0xEC 0x80-0xBF 0x80-0xBF |
3 | 0xED 0x80-0x9F 0x80-0xBF |
3 | 0xEE-0xEF 0x80-0xBF 0x80-0xBF |
4 | 0xF0 0x90-0xBF 0x80-0xBF 0x80-0xBF |
4 | 0xF1-0xF3 0x80-0xBF 0x80-0xBF 0x80-0xBF |
4 | 0xF4 0x80-0x8F 0x80-0xBF 0x80-0xBF |
压缩
一般是固定的头,固定几个字节指示
- 无损压缩
算法类型 | 代表算法 | 适用场景 |
---|---|---|
字典编码 | LZ77, LZ78, LZW | 重复数据压缩(文本) |
熵编码 | Huffman, 算术编码 | 通过加入长度来表示重复字节或字节数组 |
图片无损压缩: 对单个像素点(R|G|B|A)进行处理,例如不透明图片就可以只保存(R|G|B)三个颜色值,更进一步有单个色值的,例如只保存(R)通道
- 有损压缩
一般只针对特殊领域,例如图像
图象的有损压缩:分成一个个(width*height)小的区域进行近似关联处理,常见的是分成 (4*4) 的小区域,每个区域处理成 8 个字节
加密
加密算法
常见的加密算法:
- 对称加密:DES、AES
- 非对称加密:RSA、ECC
这些复杂的加密算法只适用于文件少且重要的,速度较慢、内存占用较高
一般对速度和性能有要求的就简单的使用xor(异或处理)
基本步骤
- 找文件的文件头,一般都是固定的内容,有多个同类的文件就很容易识别出来
- 找文本字符串,可用用做定位用,除非加密的文件,找到一个连续的文本,多切换编码试试,查看文本结尾后一个子节是不是
0x0
, 不是的话就肯定在前面标记了长度, - 长度首先考虑
byte
再考虑leb128
再uint
int
long
- 如果判断是
leb128
, 那就可以肯定 其他长度都用的leb128
, 甚至uint
ulong
等值也转成了leb128
- 找可能的分隔标记符,看见大片有规律的重复出现的子节就可靠是无意义的分隔符
- 找
0x0
,0x0
多用于补位,例如数据类型固定占用多个子节,不足就是0x0
,还有就是补数据内容的长度 - 多数数据都是重复的数据结构,即属性个数一样,用不同的数据类型去算个数是否一致。
转载请保留原文链接: https://zodream.cn/blog/id/269.html