Perl将二进制文件打印到文件-cr lf

Perl将二进制文件打印到文件-cr lf,perl,printing,binaries,Perl,Printing,Binaries,我不是一个普通的Perl程序员,我在论坛或我的几本书中都找不到关于这方面的任何东西 我正在尝试使用以下结构将二进制数据写入文件: 打印filehandle$record 我注意到,当遇到x'0A'时,我的所有记录都会被截断,因此显然Perl使用LF-as和end-of-record指示符。如何编写完整的记录,例如使用长度说明符?我还担心Perl会篡改其他二进制“非打印内容” 谢谢 FritzPerl不会“篡改”您的写入。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它

我不是一个普通的Perl程序员,我在论坛或我的几本书中都找不到关于这方面的任何东西

我正在尝试使用以下结构将二进制数据写入文件: 打印filehandle$record

我注意到,当遇到x'0A'时,我的所有记录都会被截断,因此显然Perl使用LF-as和end-of-record指示符。如何编写完整的记录,例如使用长度说明符?我还担心Perl会篡改其他二进制“非打印内容”

谢谢 FritzPerl不会“篡改”您的写入。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它们的代码的问题。(除非格式指定必须转义换行符,否则在这种情况下,写入文件的代码的“问题”在于它不会篡改数据(通过转义换行符),而是准确地写入您告诉它的内容。)

请提供一个小的(但可运行的)代码示例来演示您的问题,理想情况下包括读写,以及实际结果和期望的结果,我们将能够提供更具体的帮助

但是,请注意,
\n
不会直接映射到单个数据字节(ASCII字符),除非您处于二进制模式。如果以文本模式读取或写入文件,
\n
可能只是CR、LF或CRLF,具体取决于运行该文件的操作系统。

Perl不会“篡改”您的写入操作。如果您的记录在遇到换行符时被截断,那么这是读取它们的代码的问题,而不是写入它们的代码的问题。(除非格式指定必须转义换行符,否则在这种情况下,写入文件的代码的“问题”在于它不会篡改数据(通过转义换行符),而是准确地写入您告诉它的内容。)

请提供一个小的(但可运行的)代码示例来演示您的问题,理想情况下包括读写,以及实际结果和期望的结果,我们将能够提供更具体的帮助

但是,请注意,
\n
不会直接映射到单个数据字节(ASCII字符),除非您处于二进制模式。如果文件是以文本模式读取或写入的,
\n
可能只是CR、LF或CRLF,具体取决于运行该文件的操作系统。

是否要使用

open(my $fh, '<', $qfn) or die $!;
binmode($fh);
另一种选择是使用
read

while (1) {
   my $rv = read($fh, my $rec, 4096);
   die $! if !defined($rv);
   last if !$rv;
   ...
}

  • (又名
您想使用

open(my $fh, '<', $qfn) or die $!;
binmode($fh);
另一种选择是使用
read

while (1) {
   my $rv = read($fh, my $rec, 4096);
   die $! if !defined($rv);
   last if !$rv;
   ...
}

  • (又名

对不起,水晶球坏了。。。操作系统?代码?欢迎来到堆栈溢出!你可以在这里发布你已经拥有的代码的相关部分吗?对不起,水晶球不工作。。。操作系统?代码?欢迎来到堆栈溢出!您是否可以在这里发布您已经拥有的代码的相关部分?Perl确实可以“篡改”读写操作。两种方式:LF⇔CRLF翻译和编码⇔Perl确实可以“篡改”读写操作。两种方式:LF⇔CRLF翻译和编码⇔解码翻译。这是我需要的。我正在使用从打开的串行端口“$inrec=”读取的数据,该端口在\r\n字节处停止。我正在重写例程,以使用您提到的binmode,并读取过去的\r\n。我可以在后期处理中整理单个(可变长度)记录。不幸的是,我不能保证固定的记录长度,因为端口有时会丢失一个字节或2个。@Fritz,
sysread
将读取尽可能多的可用数据并返回该数据。你可以把你读到的内容累加在一个buf中,然后检查你是否有一个完整的框架。(
my$buf,而(1){my$rv=sysread($fh,$buf,64*1024,length($buf));die if!defined($rv);last if!$rv;…}
)如果这不起作用,
$ser
可能很神奇,如果用
sysread
代替
read
,它可能会起作用。这就是我需要的。我正在使用从打开的串行端口“$inrec=”读取的数据,该端口在\r\n字节处停止。我正在重写例程,以使用您提到的binmode,并读取过去的\r\n。我可以在后期处理中整理单个(可变长度)记录。不幸的是,我不能保证固定的记录长度,因为端口有时会丢失一个字节或2个。@Fritz,
sysread
将读取尽可能多的可用数据并返回该数据。你可以把你读到的内容累加在一个buf中,然后检查你是否有一个完整的框架。(
my$buf,而(1){my$rv=sysread($fh,$buf,64*1024,length($buf));die if!defined($rv);last if!$rv;…}
)如果这不起作用,
$ser
可能很神奇,如果用
sysread
代替
read
,它可能会起作用。