11 个版本
0.3.2 | 2022 年 7 月 21 日 |
---|---|
0.3.1 | 2022 年 7 月 21 日 |
0.3.0 | 2022 年 4 月 29 日 |
0.2.0 | 2022 年 4 月 27 日 |
0.1.9 | 2021 年 9 月 26 日 |
#612 in 文件系统
每月 75 次下载
在 passionfruit 中使用
7.5MB
1.5K SLoC
包含 (DOS 可执行文件, 2.5MB) files/2mib.exe, (DOS 可执行文件, 325KB) files/hello-world.exe, (JAR 文件, 60KB) files/hello.jar, (ELF 库, 15KB) files/test-so.so
bindet (二进制文件类型检测)
快速文件类型检测。更多信息请参阅:文档
支持文件类型
- Zip
- Rar (Rar 4 和 5)
- Tar
- Png
- Jpg
- 7-zip
- Opus
- Vorbis
- Mp3
- Webp
- Flac
- Matroska (mkv, mka, mks, mk3d, webm)
- Wasm
- Java Class
- Mach-O
- Elf (可执行和链接格式)
- Wav
- Avi
- Aiff
- Tiff
- Sqlite3 (
.db
) - Ico
- Dalvik
- Gif
- Xcf
- Scala Tasty
- Bmp
- 其他在路上
示例
use std::fs::{OpenOptions};
use std::io::BufReader;
use std::io::ErrorKind;
use bindet;
use bindet::types::FileType;
use bindet::FileTypeMatch;
use bindet::FileTypeMatches;
fn example() {
let file = OpenOptions::new().read(true).open("files/test.tar").unwrap();
let buf = BufReader::new(file);
let detect = bindet::detect(buf).map_err(|e| e.kind());
let expected: Result<Option<FileTypeMatches>, ErrorKind> = Ok(Some(FileTypeMatches::new(
vec![FileType::Tar],
vec![FileTypeMatch::new(FileType::Tar, true)]
)));
assert_eq!(detect, expected);
}
误报
某些文件类型的魔数由可读字符组成。例如,FLAC 使用 fLaC
(0x66 0x4C 0x61 0x43
) 和 PDF 使用 %PDF-
(0x25 0x50 0x44 0x46 0x2D
),因此,以这些序列开头的文本文件可能会被检测为二进制文件。
bindet 会报告这些文件类型为 FileTypeMatch::full_match = false
,第二步可以采用这些类型并通过应用更好的规范匹配来验证预测,然而,目前这仅适用于 Zip
文件。
您可以使用类似 encoding_rs 的 crate 来确定文件是否确实是二进制文件或文本文件。