1

如果我想找到二进制数据,这个子程序有意义吗?

sub is_binary_data {
    my $data = shift;
    return $data =~ /\x00/;
}
4

3 回答 3

2

你可以试试这个:

sub is_binary_data {
  my $data = shift;
  return $data =~ /[\x00-\x1F]/;
}

如果您的数据包含 \x20 以下的任何字符(后者是空格),这应该返回 true。

于 2012-10-12T07:52:04.530 回答
2

总是有-Bfilename,如果文件是二进制文件,则返回“true”。但是,正如 amon 所说,这取决于您对二进制的定义。从perlfunc

"检查文件的第一块左右是否有奇数字符,例如奇怪的控制代码或设置了高位的字符。如果发现太多奇怪的字符 (>30%),则为 -B 文件"

于 2012-10-12T12:50:51.183 回答
1

这取决于您对“二进制数据”的定义以及输入编码。如果您的脚本不使用编码并查看原始字节,即使在普通文本文件中也会发现空字节,例如当它们以 UTF-16 编码时(你好,Windows!)。

如果您对输入进行解码并对字符(而不是字节)进行操作,则只有NUL-character 会触发您的二进制检测。但是,这仅在您知道编码时才有效。二进制文件通常不编码。

最后,这是一个先有鸡还是先有蛋的问题。在 ASCII 和 ASCII 兼容编码的情况下,如果对字节进行操作,您的解决方案(使用 @sergio 扩展范围)将起作用,但会产生误报。

use Encode;
my $text = "abc";
my ($utf16bytes,$utf8bytes) = map{encode $_, $text} qw(UTF-16 UTF-8);
say "UTF-16 bytes contain NUL bytes." if $utf16bytes =~ /\x00/;
say "UTF-8  bytes contain NUL bytes." if $utf8bytes  =~ /\x00/;

输出:

UTF-16 bytes contain NUL bytes.
于 2012-10-12T11:37:39.120 回答