1

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

4

2 回答 2

4

您的示例输出不是您的程序打印的内容。您的程序以二进制(好像它是可打印的字符,尽管它不是)而不是十六进制打印出“坏”。

它在这里工作(一旦我将它传送到十六进制转储器,所以我可以阅读它),但我在 Linux 上。

最有可能出错的地方是您需要调用binmode输出文件句柄(或者用:raw图层打开它);您正在看到 CRLF 翻译的换行符。如果您binmode *STDOUT;在打印之前立即添加(在您的示例代码中),我怀疑您会得到预期的输出。

[ 在 Unix 上,没有换行符到 CRLF 的转换,所以它可以工作 ]

于 2012-01-11T21:32:38.377 回答
3

停止使用 Windows?0D0A是 Windows 行结尾的字符代码(通常被视为"\r\n"),您观察它们是因为您正在使用编码将字符0A( "\n") 打印到句柄 ( STDOUT) :crlf,这会自动将任何\n字符转换为序列\r\n

调用binmodeSTDOUT禁用此编码。这是使用带有 Cygwin 实用程序的 perl 的 MSWin32 构建的视图od

$ 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
于 2012-01-11T21:34:53.957 回答