Perl包功能坏了吗?

时间:2012-01-11 21:20:49

标签: perl perl-module pack

我有一个标题创建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

2 个答案:

答案 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