我有一个标题创建Perl脚本,它大部分时间都很好用,但每隔一段时间就会出现问题。鉴于CRC编号为772423333,PERL包功能会中断,我会直接了解它。
my $dec = 772423333;
my $broken = pack("N", $dec);
print "Good:\t", uc(sprintf("%x", $dec)), "\nBad:\t$broken"; # eg. 2E0D0A3EA5
原谅我不知道如何打印可读的HEX,但这就是它的回归。
Good: 2E0A3EA5
Bad: 2E0D0A3EA5
如何删除0D
?
答案 0 :(得分:4)
您的示例输出不是您的程序打印的内容。你的程序以二进制形式输出“坏”(好像它是可打印的字符,虽然不是),而不是十六进制。
它可以在这里工作(一旦我将它传输到十六进制转储器,所以我可以阅读它),但我在Linux上。
最有可能的是,您出错的地方是您需要在输出文件句柄上调用binmode
(或者使用:raw
图层打开它);你看到CRLF翻译换行了。如果您在打印之前立即添加binmode *STDOUT;
(在示例代码中),我怀疑您将获得预期的输出。
[在Unix上,没有新行到CRLF的翻译,所以它可以正常工作]
答案 1 :(得分:3)
停止使用Windows? 0D0A
是Windows行结尾的字符代码(更常见的是"\r\n"
),您可以观察它们,因为您要将字符0A
("\n"
)打印到句柄(STDOUT
):crlf
编码,可自动将\n
个字符转换为序列\r\n
。
在binmode
上呼叫STDOUT
以停用此编码。这是使用带有Cygwin实用程序od
的perl的MSWin32构建的视图:
$ winperl -e 'print pack("N",772423333)' | od -c
0000000 . \r \n > 245
0000005
$ winperl -e 'binmode STDOUT; print pack("N",772423333)' | od -c
0000000 . \n > 245
0000004