-1

私はここで緩い終わりにいます。それはとても単純な問題のように思えるので、簡単な答えがあることを願っています!

オフセット1536から始まる2048バイトごとに64バイトのパディングデータを持つバイナリ(約35m)があります-このパディングを削除したいだけです。

最初のオカレンスは 1536 で、次に 3648、5760、7872 などです。

(2112 バイト - 64 バイトのダミー データ = 2048)

私はbvi、bbe、hexdump + sed + xxdを試しましたが、明らかに何かが欠けています。

前もって感謝します、

4

2 に答える 2

2

コードを表示しなかったので、アルゴリズムに頭を悩ませるのに助けが必要だと思います。それは実際には非常に簡単です:

  1. STDINのEOFに達していない間、
    1. STDIN から 2112 バイトを読み取る
    2. 読み取ったバイトから、位置 1536 から始まる 64 バイトを削除します。
    3. 残りの 2048 バイトを STDOUT に出力します。

パールでは、

binmode(STDIN);
binmode(STDOUT);
while (1) {
   my $rv = read(STDIN, my $rec, 2112);
   die $! if !defined($rv);
   last if !$rv;

   substr($rec, 1536, 64, '');

   print($rec)
      or die $!;
}
于 2013-08-19T14:41:57.613 に答える
-1

Perl を使用する場合:

:rawレイヤーを含むファイルを開きます。私たちは翻訳したくない:utf8:crlf

次に、関心のある位置をシークし、数バイトを読み取ることができます

my $size = -s $filename;
open my $fh, "<:raw", $filename;
for (seek($fh, 1536, 0) ; tell($fh) + 2048 < $size ; seek($fh, 2048 - 64, 1)) {
  read $fh, my $buffer, 64;
  ...;
}

読んだ

  • perldoc -f tell
  • perldoc -f seek
  • perldoc -f read

詳細については

于 2013-08-19T14:42:25.320 に答える