【问题标题】:How do I check a file's magic number (or hex signature) in R?如何在 R 中检查文件的幻数(或十六进制签名)?
【发布时间】:2018-06-10 17:45:52
【问题描述】:

我想检测对象的文件类型以确定压缩文件的正确连接(例如是否使用bzfilegzfilexzfile 等。显然我可以“猜测”基于关于文件扩展名,但我的理解是检查magic number 会更加健壮(虽然我有点不清楚这是否可以移植到基于 Windows 的架构?)

我如何返回文件的幻数以确定它是否确实是BZh

请注意,我想要一个适合用于包开发的解决方案;例如将尽可能跨操作系统移植,而不是特定于 *nix 系统。

【问题讨论】:

  • 你能用 unix file util 解析 system("file somefilename") 吗?
  • 参见上面的编辑,我的目标是获得一个可以跨操作系统工作的解决方案,我可以将其包含在一个包中。
  • file.exe 包含在 Rtools 中
  • @r2evans 你应该把它写下来作为答案
  • cboettig,这两个答案似乎都是相关的。是否足以接受其中之一?

标签: r file compression bzip2


【解决方案1】:

Github 上有几个包以某种方式使用 libmagic:

【讨论】:

  • 精彩,精彩的总结,正是我正在寻找(希望!)的东西。非常感谢。
  • CRAN 里有吗?
  • @IndranilGayen 魔杖已提交给 CRAN:cran.r-project.org/package=wand
【解决方案2】:

我找不到已经在 R 中本地执行此操作的包或函数。尽管我认为抓取 wiki 参考表(或获取magic.mgc 的副本并解析它)并使用它相对简单readBin 或类似的,我认为跨平台使用更直接的方法是使用file 命令。当 Rtools 不可用时,唯一缺乏跨平台的就是在 windows 上。

我创建了两个文件,创造性地命名为“gz”和“bz2”,并运行了这个测试。

ptns <- list(gzip="gzip compressed data",
             bzip2="bzip2 compressed data",
             pdf15="PDF document, version 1.5",
             xlsx="Microsoft Excel")

files <- c("gz", "bz2")
out <- system2("file", args=files, stdout=TRUE)

setNames(sapply(out, function(o) {
  thistype <- "unk"
  for (j in seq_along(ptns)) {
    if (grepl(ptns[[j]], o)) {
      thistype <- names(ptns)[j]
      break
    }
  }
  thistype
}), files)
#      gz     bz2 
#  "gzip" "bzip2" 

我在内部选择for 循环的原因是我希望它在成功匹配后中断执行。

【讨论】:

    猜你喜欢
    • 2017-06-14
    • 2023-02-15
    • 2014-01-25
    • 1970-01-01
    • 2019-09-07
    • 2018-06-28
    • 1970-01-01
    • 2011-07-15
    • 2010-10-10
    相关资源
    最近更新 更多