过滤掉二进制数据

时间:2012-10-12 07:45:26

标签: perl filter binary-data

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

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

3 个答案:

答案 0 :(得分:2)

你可以试试这个:

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

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

答案 1 :(得分:2)

始终有-B filename ,如果文件是二进制文件,则返回“true”。但是,正如amon所说,这取决于你对二进制的定义。来自 perlfunc

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

答案 2 :(得分:1)

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

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

最后,这是一个鸡蛋或鸡蛋问题。对于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.