如果我想找到二进制数据,这个子程序有意义吗?
sub is_binary_data {
my $data = shift;
return $data =~ /\x00/;
}
如果我想找到二进制数据,这个子程序有意义吗?
sub is_binary_data {
my $data = shift;
return $data =~ /\x00/;
}
你可以试试这个:
sub is_binary_data {
my $data = shift;
return $data =~ /[\x00-\x1F]/;
}
如果您的数据包含 \x20 以下的任何字符(后者是空格),这应该返回 true。
总是有-B
filename,如果文件是二进制文件,则返回“true”。但是,正如 amon 所说,这取决于您对二进制的定义。从perlfunc:
"检查文件的第一块左右是否有奇数字符,例如奇怪的控制代码或设置了高位的字符。如果发现太多奇怪的字符 (>30%),则为 -B 文件"
这取决于您对“二进制数据”的定义以及输入编码。如果您的脚本不使用编码并查看原始字节,即使在普通文本文件中也会发现空字节,例如当它们以 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.