Perl файл в шестнадцатеричное число 82? - PullRequest
0 голосов
/ 09 июня 2019

Попытка сделать двоичное преобразование в шестнадцатеричный файл. Я могу вывести шестнадцатеричный код, но, тем не менее, когда я пытаюсь вывести результат в файл, переменная возвращает строку «82». Я не могу понять почему; как и все вещи, скорее всего, что-то простое.

#!/usr/bin/perl -w

use strict;

my $blockSize = 1024;
my $fileName = $ARGV[0];
my $hexName = $ARGV[1];
open(F,"<$fileName") or die("Unable to open file $fileName, $!");
binmode(F);
my $buf;
my $ct=0;

while(read(F,$buf,$blockSize,$ct*$blockSize)){
    foreach(split(//, $buf)){
    printf unpack ("H*", $_);    #prints the hex stream to terminal just fine
    open(H,">$hexName") or die("Unable to open file $fname, $!");
    binmode (H);
        printf H unpack ("H*", $_);
    close (H);

    }
    print "\n";
    $ct++;
}
close(F);

выход

perl rawrHexFile.pl test.png file.hex
89504e470d0a1a0a0000000....

mookie @ temple: / srv / bench% cat file.hex 82

cat file.hex
82

Спасибо.

Вот мой последний код, который работает. в случае

use strict;
my $fileName = $ARGV[0];
my $hexName = $ARGV[1];
my $hexCodeFile = $ARGV[2];
my $hexDecodeFile = $ARGV[3];
my $blockSize = -s $fileName;
my $buf;

open(F,"<$fileName") or die("Unable to open file $fileName, $!");
binmode(F);

open(H,">$hexName") or die("Unable to open file $hexName, $!");
read(F,$buf,$blockSize);
        print H unpack ("H*", $buf);
close (H);
close(F);

1 Ответ

1 голос
/ 10 июня 2019

Вы воссоздаете файл (open>) для каждого байта входного файла, поэтому вы получаете только выходные данные для последнего байта входного файла.Откройте файл вне цикла.

Кроме того, вы продолжаете добавлять к $buf вместо того, чтобы заменять его содержимое, поэтому ваш вывод будет выглядеть как AABABCABCDABCDE вместо желаемого ABCDE (где каждая буква представляет вывод для 1024байтов ввода)

Исправлено:

use strict;
use warnings qw( all );

use constant BLOCK_SIZE => 64*1024;

my ($in_qfn, $out_qfn) = @ARGS;

open(my $in_fh, '<:raw', $in_qfn)
   or die("Unable to open \"$in_qfn\": $!\n");
open(my $out_fh, '>', $out_qfn)
   or die("Unable to open \"$out_qfn\": $!\n");

while (1) {
    defined( my $rv = sysread($in_fh, my $buf, BLOCK_SIZE) )
       or die("Unable to read from \"$in_qfn\": $!\n");

    last if !$rv;

    print($fh_out unpack("H*", $buf))
       or die("Unable to write to \"$out_qfn\": $!\n");
}

close($fh_in);
close($fh_out)
   or die("Unable to write to \"$out_qfn\": $!\n");

Выше было решено множество других проблем в вашей программе:

  • Использование 2-аргументного открытия
  • Использование printf без шаблона
  • Бесполезное использование глобальных переменных
  • Излишнее разделение ввода, когда unpack H* обрабатывает строки любой длины
  • Неэффективное чтение 1 КиБкогда Perl читает из ОС в виде фрагментов по 4 КиБ или 8 КиБ
  • Использование binmode для текстового файла
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...