データベースにIPアドレスを格納する時は整数型にしたほうがブロックで検索出来たりと後々取り扱いが楽だったりするので変換する変換方法を書いてみる
#!/usr/bin/perl
use utf8;
use strict;
use warnings;
my $addr_i = &addr_s_to_i("192.168.1.1");
my $addr_s = &addr_i_to_s($addr_i);
print "INTEGER:" . $addr_i . "\n";
print "STRING :" . $addr_s . "\n";
# IPアドレスを文字列型から整数型に変換
sub addr_s_to_i {
my $addr = shift;
# "."ごとに8bitずつ区切りそれを2進数に変換し配列に入れる
my @addrs;
foreach my $addr_split (split('\.', $addr)){
push(@addrs, sprintf("%08b", $addr_split));
}
# 区切った2進数を連結する
my $bin = join('', @addrs);
# 2進数を10進数に変換
my $result = oct('0b' . $bin);
return $result;
}
# IPアドレスを整数型から文字列型に変換
sub addr_i_to_s {
my $addr = shift;
# 10進数を32bitの2進数に変換
my $bin = sprintf("%032b", $addr);
# 2進数を8bitごとに区切り10進数に変換し配列に入れる
my @addrs;
foreach my $addr_split ($bin =~ m/.{8}/g){
push(@addrs, oct('0b' . $addr_split));
}
# "."ごとに区切り連結する
my $result = join('.', @addrs);
return $result;
}
実行結果
INTEGER:3232235777
STRING :192.168.1.1
0 Comments.