c - 额外的字节在 CPIO 生成的文件中填充
问题描述
我有一个目录中的文件列表,我想创建一个存档格式文件。我使用 CPIO 将文件创建为
ls | cpio -ov -H crc > demo.cpio
我有一个像这样的cpio结构
struct cpio_newc_header {
char c_magic[6];
char c_ino[8];
char c_mode[8];
char c_uid[8];
char c_gid[8];
char c_nlink[8];
char c_mtime[8];
char c_filesize[8];
char c_devmajor[8];
char c_devminor[8];
char c_rdevmajor[8];
char c_rdevminor[8];
char c_namesize[8];
char c_check[8];
};
我可以通过使用 c_filesize,c_namesize 来获取标头中的元数据、路径名、文件数据。我可以根据 c_filesize 获取文件数据,但是在获取文件数据之后,会填充一些额外的位,即在文件数据之后在下一个标题之前。
00000230: 6e63 6965 7322 3a5b 5d0d 0a7d 0d0a 0000 ncies":[]..}....
00000240: 3037 3037 3032 3030 3636 4246 3838 3030 0707020066BF8800
在这里我们可以观察到在 '}' 之后填充了一些额外的字节。我用四的倍数教它四舍五入,但我观察到其他一些不是四的倍数的数据
00000450: 2066 6f72 2063 7279 7074 6f20 7665 7269 for datapo veri
00000460: 6669 6361 7469 6f6e 0a00 0000 3037 3037 fication....0707
为什么额外的字节是填充。我们可以在做 CPIO 时避免吗?
解决方案
从 cpio 的手册页(新 ASCII 格式部分):
路径名后跟 NUL 字节,因此固定标头加上路径名的总大小是四的倍数。同样,文件数据被填充为四个字节的倍数。请注意,此格式仅支持 4 GB 文件(与支持 8 GB 文件的旧 ASCII 格式不同)。
在您的第二个示例中,它也被填充为 4 字节对齐:
00000460: 6669 6361 7469 6f6e 0a00 0000 3037 3037 fication....0707
您会看到,数据结束于0x468
并添加了三个额外的零字节用于填充,因此下一个块可以开始于0x46c
.
执行此填充可能是为了避免在将标头字段读入内存后对其进行未对齐的访问。它是规范的一部分,因此无法避免它。
但计算起来很容易。如果偏移量x
是文件结束后的下一个字节,则下一个头从偏移量开始
int nextheader = (x+3)&~3;
推荐阅读
- c# - DataGrid中的ComboxBox未在WPF中显示列表
- c# - 无法将类型字符串隐式转换为 int、枚举
- java - 在 JCombo Box Java 中将文本添加到字符串
- ios - 如何继续填充 UITableView
- python - 蒙特卡罗模拟预测波动率
- javascript - HTML 复选框数组未正确传递给 javascript
- python - 在一个类中,从另一个函数访问一个函数中的字典值
- python - 确保用户在使用 BMI Analyzer 时仅输入整数
- css - 无法加载 @font-face 字体
- python - 删除/删除 NxM 矩阵每一行中的每个最小值?