首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将Perl字符串转换为Base36

将Perl字符串转换为Base36
EN

Stack Overflow用户
提问于 2012-09-27 05:31:15
回答 2查看 618关注 0票数 0

如何在perl中将字符串转换为base36 (0-9,a-z)?

我想通过一对一映射将IP地址转换为base36,这样我就可以在网址中使用它们。

127.0.0.1 === string ==> 127000000001 === base36 ==>

72.98.234.11 === string ==> 072098234011 === base36 ==>

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-09-27 05:41:33

基数10还不够好吗?这在0-4294967295中给出了一个数字。这只比我们从你的方式中得到的(1到8位数字)略长一点。

代码语言:javascript
复制
$ perl -E'say unpack "N", pack "C4", split /\./, $ARGV[0]' 127.0.0.1
2130706433

$ perl -E'say unpack "N", pack "C4", split /\./, $ARGV[0]' 72.98.234.11
1214441995

完全可逆:

代码语言:javascript
复制
$ perl -E'say join ".", unpack "C4", pack "N", $ARGV[0]' 2130706433
127.0.0.1

$ perl -E'say join ".", unpack "C4", pack "N", $ARGV[0]' 1214441995
72.98.234.11

您可以使用CPAN上的任意数量的模块将该数字转换为除10以外的另一个基数。

代码语言:javascript
复制
base 10: 1-10 digits
base 16: 1-8 digits    # Can be done very efficiently
base 32: 1-7 digits    # Can be done very efficiently
base 36: 1-7 digits
base 62: 1-6 digits
base 64: 1-6 digits    # Can be done very efficiently

基数16:

代码语言:javascript
复制
sub pack_ip { sprintf "%X", unpack "N", pack "C4", split /\./, $_[0] }

sub unpack_ip { join ".", unpack "C4", pack "N", hex $_[0] }

Base 64:(这应该是相当快的。即使移植到C++也更快。)

代码语言:javascript
复制
my @syms = ('0'..'9', 'A'..'Z', 'a'..'z', '_', '-');
my %syms = map { $sym[$_] => $_ } 0..$#syms;

sub pack_ip {
   my $num = unpack "N", pack "C4", split /\./, $_[0];
   my $base64 = join '', @syms[
      ($num >> 30) & 0x3F,
      ($num >> 24) & 0x3F,
      ($num >> 18) & 0x3F,
      ($num >> 12) & 0x3F,
      ($num >>  6) & 0x3F,
      ($num >>  0) & 0x3F,
   ];
   $base64 =~ s/^A+(?!\z)//;
   return $base64;
}

sub unpack_ip {
   my $num;
   $num = ($num << 6) | $sym{$_}
      for split //, $_[0];
   return join ".", unpack "C4", pack "N", $num;
}
票数 4
EN

Stack Overflow用户

发布于 2012-09-27 06:24:40

既然IP地址基本上就是16进制,你为什么不使用基数16呢?

代码语言:javascript
复制
sub ip_to_hex {
  join('', map { sprintf('%02x', $_) } split(/\./, shift));
}

sub hex_to_ip {
  join('.', map { hex($_) } shift =~ m/([0-9a-f]{2})/g);
}

say ip_to_hex('127.0.0.1');    # 7f000001
say ip_to_hex('72.98.234.11'); # 4862ea0b
say hex_to_ip('4862ea0b');     # 72.98.234.11
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12610758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档