【问题标题】:First 1000 bytes of a variable变量的前 1000 个字节
【发布时间】:2012-10-05 10:13:34
【问题描述】:

如果我想用变量前 1000 个字节尝试这个猜测子例程,unpack 的用法是否正确?

#!/usr/bin/env perl
use warnings;
use 5.10.1;

my $var = ...;
my $part = unpack( 'b1000', $var ) ;

sub is_binary_data {
    local $_ = shift;
    (   tr/ -~//c / length  ) >= .3;
}

if ( is_binary_data( $part ) ) {
    say "Binary";
}
else {
    say "Text";
}

【问题讨论】:

  • 检查二进制数据的另一个选项可能是使用Encode::Guess (perldoc.perl.org/Encode/Guess.html),它用于确定字符串的字符编码。将您已知的字符编码设置为它尝试的唯一选项;如果失败,你就知道你有二进制数据。

标签: perl text binary-data unpack


【解决方案1】:

不是,因为 unpack 会创建一个由 0 和 1 组成的字符串(最多 1000 个),这肯定会通过 ascii 测试(我相信 tr, -~,,c / length 是)

我建议只使用substr ($var, 0, 1000)

另外,\r\n 可能应该出现在 tr// 中。

【讨论】:

  • 当然要注意,从技术上讲,这会提取前 1000 个字符;如果 $var 是 Unicode 字符串,这可能会有所不同
  • 我建议将tr// 扩展为\x09-\x0d -~\x09-\x0d 等效于 POSIX [:space:] 并且 `-~` 等效于 POSIX [:print:]。这应该涵盖大多数人认为的 ASCII 文本。如果tr// 可以使用字符类,或者s/[^[:print:][:space:]]//g; 不会慢大约 15 倍,那就太好了。
  • @LeoNerd,取决于您所说的“Unicode 字符串”是什么意思。如果您的意思是使用 UTF8=1 格式存储的字符串,substr($_,0,1000) 可以正常工作。如果您的意思是包含超过 255 个字符的字符串,那么这个问题毫无意义。 (找不到不是字节的东西的前 1000 个字节。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 1970-01-01
  • 1970-01-01
  • 2023-01-13
  • 2019-03-11
  • 2022-01-18
  • 2020-07-14
相关资源
最近更新 更多