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 文件系统

Download history 59/week @ 2024-03-11 39/week @ 2024-03-18 116/week @ 2024-03-25 147/week @ 2024-04-01 280/week @ 2024-04-08 71/week @ 2024-04-15 112/week @ 2024-04-22 276/week @ 2024-04-29 204/week @ 2024-05-06 41/week @ 2024-05-13 22/week @ 2024-05-20 9/week @ 2024-05-27 13/week @ 2024-06-03 16/week @ 2024-06-10 32/week @ 2024-06-17 13/week @ 2024-06-24

每月 75 次下载
passionfruit 中使用

MIT/Apache

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 (二进制文件类型检测)

Crates Pipeline MIT License

快速文件类型检测。更多信息请参阅:文档

支持文件类型

  • 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
  • Pdf
  • 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 来确定文件是否确实是二进制文件或文本文件。

依赖项