【问题标题】:Perl Decimal to Binary 32-bit then 8-bitPerl 十进制到二进制 32 位然后 8 位
【发布时间】:2011-06-24 05:39:15
【问题描述】:

我有一个数字 (3232251030) 需要从十进制转换为二进制。 一旦我得到二进制文件,我需要将它的 8 位分成数字,显示一个 IP 地址。

将十进制转换为二进制很简单:

sub dec2bin { my $str = unpack("B32", pack("N", shift)); $str =~ s/^0+(?=\d)//; # otherwise you'll get leading zeros return $str; }

sub bin2dec { return unpack("N", pack("B32", substr("0" x 32 . shift, -32))); }

e.g. $num = bin2dec('0110110'); # $num is 54 $binstr = dec2bin(54); # $binstr is 110110

参考:http://www.perlmonks.org/?node_id=2664

所以现在,我需要从二进制文件中拆分出 8 位数字并将其保存为构成 IP 地址的数字。

$num = dec2bin('3232251030');

($num 在二进制中是“11000000 10101000 01000100 00001110”)

我需要将每个 8 位“11000000 10101000 01000100 00001110”拆分并保存到“192.168.60.150”中。

愿意提供建议吗?我正在为此研究拆分功能..

【问题讨论】:

  • 你确定你真的需要整个二进制阶段吗?听起来您只想将字符串转换为整数,然后将其解压缩为字节。
  • 我得到了一个整数,想转成二进制,然后将每8位作为单独的数字处理,形成一个ip地址(xxx.xxx.xxx.xxx)。
  • .ua 网站上的图书链接几乎可以肯定是非法副本。

标签: perl binary decimal 8-bit


【解决方案1】:

您实际上不必转换为二进制字符串,只需转换为 32 位整数:

print join '.', unpack('CCCC', pack('N', 3232251030));

将打印192.168.60.150

【讨论】:

  • 或者只是 'C*' 而不是 'CCCC'
  • 天哪;这么简单?在这里,我试图想出很多方法。谢谢!我将开始学习更多关于打包和解包的知识。非常酷。 =)
【解决方案2】:
say join('.', unpack('C4', pack('N', 3232251030)));

use Socket qw( inet_ntoa );
say inet_ntoa(pack('N', 3232251030));

两个输出

192.168.60.150

【讨论】:

  • +1 表示 Socket 模块。 pack 没有显示代码的意图,使用适当的模块可以。一旦代码需要更改以适应 IPv6,维护程序员将很难使用 pack 代码,因为它的抽象级别较低,而对于模块,它只是另一个函数调用。
  • @daxim:你如何避免pack 调用?即使使用inet_ntoa 也需要pack
  • 我犯了一个错误,道歉。 s/pack/unpack/ 你知道我的意思
  • @Gabe 确实有道理。我们正在处理一个 IPv4 地址,我们必须知道我们正在处理一个 IPv4 地址,以便为inet_ntoajoin+unpack 创建正确的字节字符串。另一方面,@daxim 也有一个观点,即使用inet_ntoa 确实使事情变得更清晰,并提供了更好的升级路径,即使只是一半的 sn-p。
  • @daxim:将 32 位十进制数字转换为 IP 地址的整个概念意味着它从一开始就与 IPv6 相当不兼容。
猜你喜欢
  • 1970-01-01
  • 2022-12-29
  • 1970-01-01
  • 2020-02-06
  • 2019-07-02
  • 2019-07-18
  • 2018-06-24
  • 2013-12-26
  • 2012-06-11
相关资源
最近更新 更多