Проблема преобразования текстового файла в двоичный файл с использованием Perl - PullRequest
0 голосов
/ 19 июня 2019

Я хотел бы преобразовать некоторые данные в двоичном формате, используя Perl. Данные должны быть выведены в 8-битном двоичном формате. Исходные данные поступают в следующем формате:

137.0000
136.0000
133.0000
136.0000
10.0000
134.0000
0.0000
132.0000
132.0000

Для этого я преобразовал данные для подавления «.0000», затем использую функцию pack с параметром C* (этот формат соответствует «беззнаковому символу (обычно 8 бит)» в соответствии с документация). Я назвал этот файл txt2bin.pl:

my $file = $ARGV[0];
my $fileout = $file.".bin";

if($file eq "-h" or $file eq "-help" or $file eq "")
{  
    print "Usage : txt2bin.pl file_in\n";
    print "        file_out = file_in.bin\n";
    print "This script converts a txt file to a binary file\n";

}

else
{
  print "File in = $file\n";
  print "File out = $fileout\n";

  open(FILE,"<$file") or die $!;
  open(FILEOUT,">$fileout") or die $!;
    binmode FILEOUT;
    while(defined(my $line=<FILE>))
    {
      chomp($line);
      $line =~ s/\.0000//;
      syswrite FILEOUT, pack("C*",$line);
    }
  close(FILE);
  close(FILEOUT);
}

Мне также нужно иметь возможность выполнить обратную операцию, поэтому я создал другой файл bin2txt.pl:

my $file = $ARGV[0];
my $fileout = $file.".txt";

if($file eq "-h" or $file eq "-help" or $file eq "")
{
    print "Usage : bin2txt.pl file_in\n";
    print "        file_out = file_in.txt\n";
    print "This script converts a binairy file to a txt file\n";
}

else
{
  print "File in = $file\n";
  print "File out = $fileout\n";

  my $file = "<$file";

  # undef $/ to read whole file in one go
  undef $/;

  open(FILE,$file) or die $!;
  open(FILEOUT,">$fileout") or die $!;

  # binmode FILE to supress conversion of line endings
  binmode FILE;

  my $data = <FILE>;
  $data =~ s/(.{1})/unpack("C*",$1).".0000 \n"/eg;
  syswrite FILEOUT, $data;
}

Однако, когда я выполняю первую программу txt2bin.pl, затем вторую я должен получить:

137.0000
136.0000
133.0000
136.0000
10.0000
134.0000
0.0000
132.0000
132.0000

Вместо этого я получаю это:

137.0000
136.0000
133.0000
136.0000

134.0000
0.0000
132.0000
132.0000

10.0000 не появляется, у вас, ребята, есть идеи по этому поводу? Спасибо за помощь.

1 Ответ

2 голосов
/ 19 июня 2019

Вам нужно добавить модификатор s в подстановку регулярных выражений, чтобы соответствовать 10 (новая строка):

$data =~ s/(.{1})/unpack("C*",$1).".0000 \n"/seg;

From perldoc perlre :

s
Обрабатывать строку как одну строку.То есть изменить "."соответствовать любому символу, даже символу новой строки, который обычно не соответствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...