如果我想找到二进制数据,那么这个子程序是否有意义?
sub is_binary_data {
my $data = shift;
return $data =~ /\x00/;
}
答案 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.