如何在 R 中检查文件的幻数(或十六进制签名)?
How do I check a file's magic number (or hex signature) in R?
我想检测对象的文件类型以确定压缩文件的正确连接(例如,是否使用 bzfile
gzfile
、xzfile
等. 显然我可以 "guess" 基于文件扩展名,但我的理解是检查 magic number 会更健壮(尽管我有点不清楚这是否可以移植到 Windows-基于架构?)
如何 return 文件的幻数来确定它是否确实是 BZh
?
请注意,我想要一个适用于包开发的解决方案;例如将尽可能跨操作系统移植,而不是特定于 *nix 系统。
我找不到已经编写的包或函数在 R 中本地执行此操作。尽管我认为抓取 wiki 参考 table(或获取 magic.mgc
并解析它)并使用 readBin
或类似的,我认为跨平台使用更直接的方法是使用 file
命令。唯一缺乏跨平台的是 windows 当 Rtools 不可用时。
我创建了两个文件,创造性地命名为"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
循环的原因是我希望它在成功匹配后中断执行。
Github 上有几个软件包以某种方式使用 libmagic:
- https://github.com/hrbrmstr/wand:在 *nix 上包装
libmagic
并在 Windows. 上使用 Rtools 中的 file.exe
- https://github.com/hrbrmstr/simplemagic:仅使用
magic.mgc
. 中的子集的 R 解决方案
- https://github.com/daqana/dqmagic: Wraps
libmagic
on *nix and compiles libmagic
on Windows (c.f. https://github.com/daqana/dqmagic/tree/windows)
我想检测对象的文件类型以确定压缩文件的正确连接(例如,是否使用 bzfile
gzfile
、xzfile
等. 显然我可以 "guess" 基于文件扩展名,但我的理解是检查 magic number 会更健壮(尽管我有点不清楚这是否可以移植到 Windows-基于架构?)
如何 return 文件的幻数来确定它是否确实是 BZh
?
请注意,我想要一个适用于包开发的解决方案;例如将尽可能跨操作系统移植,而不是特定于 *nix 系统。
我找不到已经编写的包或函数在 R 中本地执行此操作。尽管我认为抓取 wiki 参考 table(或获取 magic.mgc
并解析它)并使用 readBin
或类似的,我认为跨平台使用更直接的方法是使用 file
命令。唯一缺乏跨平台的是 windows 当 Rtools 不可用时。
我创建了两个文件,创造性地命名为"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
循环的原因是我希望它在成功匹配后中断执行。
Github 上有几个软件包以某种方式使用 libmagic:
- https://github.com/hrbrmstr/wand:在 *nix 上包装
libmagic
并在 Windows. 上使用 Rtools 中的 - https://github.com/hrbrmstr/simplemagic:仅使用
magic.mgc
. 中的子集的 R 解决方案
- https://github.com/daqana/dqmagic: Wraps
libmagic
on *nix and compileslibmagic
on Windows (c.f. https://github.com/daqana/dqmagic/tree/windows)
file.exe