Я хотел бы преобразовать некоторые данные в двоичном формате, используя 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
не появляется, у вас, ребята, есть идеи по этому поводу?
Спасибо за помощь.