Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 如何从pack函数打印结果?_Perl - Fatal编程技术网

Perl 如何从pack函数打印结果?

Perl 如何从pack函数打印结果?,perl,Perl,我喜欢验证pack的功能。我有下面的代码来尝试一下 $bits = pack 'N','134744072'; 如何打印位 我做了以下工作: printf ("bits = %032b \n", $bits); 但它不起作用 谢谢 如果需要数字的二进制表示,请使用 my $num = 134744072; printf("bits = %032b\n", $num); 如果需要字节字符串的二进制表示,请使用 my $bytes = pack('N', 134744072); prin

我喜欢验证pack的功能。我有下面的代码来尝试一下

$bits = pack 'N','134744072';
如何打印位

我做了以下工作:

printf ("bits = %032b \n", $bits);  
但它不起作用


谢谢

如果需要数字的二进制表示,请使用

my $num = 134744072;
printf("bits = %032b\n", $num); 

如果需要字节字符串的二进制表示,请使用

my $bytes = pack('N', 134744072);
printf("bits = %s\n", unpack('B*', $bytes)); 

如果需要数字的二进制表示,请使用

my $num = 134744072;
printf("bits = %032b\n", $num); 

如果需要字节字符串的二进制表示,请使用

my $bytes = pack('N', 134744072);
printf("bits = %s\n", unpack('B*', $bytes)); 
模块(Perl附带)允许您检查变量的Perl表示形式。在处理二进制数据而不是可打印的字符串时,这可能比原始的
打印更有用

#!/usr/bin/perl

use strict;
use warnings;

use Devel::Peek qw(Dump);

my $bits = pack 'N','134744072';

Dump($bits);
产生如下输出:

SV = PV(0xaedb20) at 0xb15650
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0xb06630 "\10\10\10\10"\0
  CUR = 4
  LEN = 10
开头的“SV”表示这是“标量值”的转储(与数组或散列值相反)

“SV=PV”表示该标量包含一个字节字符串(与整数或浮点值相反)

“PV=0xb06630”是指向这些字节所在位置的指针

“\10\10\10\10”\0可能是您感兴趣的部分。双引号字符串表示构成该字符串内容的字节。 在字符串中,您通常会看到字节被解释为ASCII,因此字节65十进制将显示为“A”。所有不可打印的字符都以八进制显示,前面有一个
\

因此,
$bits
变量包含4个字节,每个八进制'10'为十六进制0x08

LEN和CUR告诉您,Perl分配了10个字节的存储空间,目前正在使用其中的4个字节(因此
length($bits)
将返回4)。

模块(Perl附带)允许您检查Perl对变量的表示。在处理二进制数据而不是可打印的字符串时,这可能比原始的
打印更有用

#!/usr/bin/perl

use strict;
use warnings;

use Devel::Peek qw(Dump);

my $bits = pack 'N','134744072';

Dump($bits);
产生如下输出:

SV = PV(0xaedb20) at 0xb15650
  REFCNT = 1
  FLAGS = (POK,pPOK)
  PV = 0xb06630 "\10\10\10\10"\0
  CUR = 4
  LEN = 10
开头的“SV”表示这是“标量值”的转储(与数组或散列值相反)

“SV=PV”表示该标量包含一个字节字符串(与整数或浮点值相反)

“PV=0xb06630”是指向这些字节所在位置的指针

“\10\10\10\10”\0可能是您感兴趣的部分。双引号字符串表示构成该字符串内容的字节。 在字符串中,您通常会看到字节被解释为ASCII,因此字节65十进制将显示为“A”。所有不可打印的字符都以八进制显示,前面有一个
\

因此,
$bits
变量包含4个字节,每个八进制'10'为十六进制0x08



LEN和CUR告诉您Perl分配了10个字节的存储空间,目前正在使用其中的4个(因此
length($bits)
将返回4)。

在解包之前检查$bytes中的内容是什么?您想检查什么?如果要检查它是否包含(可能是)一个字节字符串,可以使用
$bytes=~/^[\x00-\xFF]*\z/
在解包之前,我喜欢以$bytes打印内容。非常感谢!!要打印
$bytes
中的字节,请使用
打印$fh$bytes我试图理解这个语句“join.”、解包“C4”、打包“N”、移位“一块一块地做什么。非常感谢你的帮助!!是否要在解包之前检查$bytes中的内容?要检查什么?如果要检查它是否包含(可能是)一个字节字符串,可以使用
$bytes=~/^[\x00-\xFF]*\z/
在解包之前,我喜欢以$bytes打印内容。非常感谢!!要打印
$bytes
中的字节,请使用
打印$fh$bytes我试图理解这个语句“join.”、解包“C4”、打包“N”、移位“一块一块地做什么。非常感谢你的帮助!!哇,多么糟糕的打印方式,$bits
Dump
是查看OP不感兴趣的内部结构。我确信您知道,Perl格言之一是“有多种方法可以做到这一点”。我正好演示了这一点——一种方法。研究替代方法并评估其相对优点具有指导意义。另外,您如何知道OP(或者其他阅读问题的人)对Perl的内部结构不感兴趣?这并不意味着所有方法都是平等的。你选择了一个非常混乱的,并且用不必要的信息使读者负担过重,并且不总是提供正确的结果(例如,对于魔法变形金刚)。您甚至没有提到在打印多个字符串时要查看哪个字符串(例如,对于UTF8=1的VAR)。您似乎决心要选择一场战斗。我从来没有声称所有的方法都是平等的。我确实特别提到了要在示例中查看的字符串,这正是OP应该看到的。这个例子没有涉及一系列的代码点,所以我没有提到例子中没有提到的UTF8版本。关于“你似乎决心要挑起一场战斗”,我不认为我的评论攻击了你的答案有任何疑问。//关于“我从未声称所有的方法都是平等的”,我感到困惑。你是说你同意我最初的评论吗?听起来确实不是这样。哇,这是多么糟糕的打印方式,$bits
Dump
是查看OP不感兴趣的内部结构。我确信您知道,Perl格言之一是“有多种方法可以做到这一点”。我正好演示了这一点——一种方法。研究替代方法并评估其相对优点具有指导意义。另外,您如何知道OP(或者其他阅读问题的人)对Perl的内部结构不感兴趣?这并不意味着所有方法都是平等的。您选择了一个非常混乱的,并且用不必要的信息使读者过载,并且不总是提供cor