1

バイナリデータを見つけたい場合、このサブルーチンは理にかなっていますか?

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

3 に答える 3

1

それは、「バイナリデータ」の定義と入力エンコーディングによって異なります。スクリプトがエンコーディングを使用せず、生のバイトを見ると、たとえば、UTF-16 (こんにちは、Windows!) でエンコードされている場合など、通常のテキスト ファイルでも null バイトが見つかります。

入力をデコードして文字 (バイトではない) を操作する場合、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 に答える