加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

perl – 你能解释一下我从解包中得到的东西吗?

发布时间:2020-12-15 21:51:28 所属栏目:大数据 来源:网络整理
导读:我对Perl相对缺乏经验,但我的问题是在获取数值的位时解压缩函数.例如: my $bits = unpack("b*",1);print $bits; 这导致打印10001100,其为十进制140.按相反的顺序,它是十进制的49.我试过的任何其他值似乎给出了不正确的位. 但是,当我通过pack运行$bits时,它
我对Perl相对缺乏经验,但我的问题是在获取数值的位时解压缩函数.例如:
my $bits = unpack("b*",1);
print $bits;

这导致打印10001100,其为十进制140.按相反的顺序,它是十进制的49.我试过的任何其他值似乎给出了不正确的位.

但是,当我通过pack运行$bits时,它再次生成1.这里有什么我想念的吗?

当我认为我的问题得到解决时,我似乎得出了结论.也许我应该简单解释一下我正在尝试做什么.

我需要将一个可能大到24位长的整数值(可能大于一个字节)转换为位串.这可以使用@ikegami建议的解包和打包来完成,但我还需要找到一种方法将该位串转换回它的原始整数(不是它的字符串表示).

正如我所提到的,我对Perl相对缺乏经验,而且我一直在尝试没有成功.

我找到了似乎是最佳解决方案:

my $bits = sprintf("%032b",$num);
print "$bitsn";
my $orig = unpack("N",pack("B32",substr("0" x 32 . $bits,-32)));
print "$orign";

解决方法

您正在尝试将整数转换为二进制,然后返回.虽然您可以使用 pack然后 unpack执行此操作,但更好的方法是使用%b格式的 sprintf或 printf:
my $int = 5;
my $bits = sprintf "%024bn",$int;
print "$bitsn";

换句话说(将0和1的字符串转换为整数),最好的方法是使用带有0b前缀的oct函数:

my $orig = oct("0b$bits");
print "$orign";

正如其他人所解释的那样,unpack需要一个字符串来解包,所以如果你有一个整数,你首先必须将它打包成一个字符串. %b格式需要以整数开头.

如果您需要在字节上执行大量此操作,并且速度至关重要,则可以构建查找表:

my @binary = map { sprintf '%08b',$_ } 0 .. 255;

print $binary[$int];  # Assuming $int is between 0 and 255

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读