なかだです。

At Fri, 6 Dec 2002 04:08:17 +0900,
Akinori MUSHA wrote:
>  ipaddr.rb というライブラリを rough に入れました。IP アドレスを
> 表現するクラス IPAddr を提供します。

なんとなく冗長に感じられた部分をいじってみました。

Integer(Bignum)とバイナリデータの変換が意外とめんどくさいので、
そういうメソッドがほしいと思いました。バイト数指定のpack/unpack
のn/Nのようなもの。


Index: ipaddr.rb =================================================================== RCS file: /cvs/ruby/src/rough/lib/ipaddr.rb,v retrieving revision 1.2 diff -u -2 -p -r1.2 ipaddr.rb --- ipaddr.rb 5 Dec 2002 19:20:30 -0000 1.2 +++ ipaddr.rb 6 Dec 2002 05:46:54 -0000 @@ -170,4 +170,5 @@ class IPAddr IN4MASK = 0xffffffff IN6MASK = 0xffffffffffffffffffffffffffffffff + IN6FORMAT = (["%.4x"] * 8).join(':') def IPAddr::new_ntoh(addr) @@ -180,9 +181,5 @@ class IPAddr s = addr.unpack('CCCC').join('.') when 16 - n = addr.unpack('CCCCCCCCCCCCCCCC') - s = (0..7).map { |i| - j = i * 2 - sprintf("%02x%02x", n[j], n[j + 1]) - }.join(':') + s = IN6FORMAT % addr.unpack('n8') else raise ArgumentError, "unsupported address family" @@ -267,11 +264,9 @@ class IPAddr case @family when Socket::AF_INET - return (0..3).map { |i| - (@addr >> (24 - 8 * i)) & 0xff - }.pack('CCCC') + return [@addr].pack('N') when Socket::AF_INET6 - return (0..15).map { |i| - (@addr >> (120 - 8 * i)) & 0xff - }.pack('CCCCCCCCCCCCCCCC') + return (0..7).map { |i| + (@addr >> (112 - 16 * i)) & 0xffff + }.pack('n8') else raise "unsupported address family" @@ -510,14 +505,11 @@ class IPAddr case @family when Socket::AF_INET - return (0..3).map { |i| - (@addr >> (24 - 8 * i)) & 0xff - }.reverse.join('.') + n = "%.4x" when Socket::AF_INET6 - return (0..31).map { |i| - sprintf("%x", ((@addr >> (124 - 4 * i)) & 0xf)) - }.reverse.join('.') + n = "%.32x" else raise "unsupported address family" end + (n % @addr).reverse!.gsub!(/.(?!$)/, '\&.') end @@ -529,7 +521,5 @@ class IPAddr }.join('.') when Socket::AF_INET6 - return (0..7).map { |i| - sprintf("%04x", ((addr >> (112 - 16 * i)) & 0xffff)) - }.join(':') + return (("%.32x" % addr).gsub!(/.{4}(?!$)/, '\&:')) else raise "unsupported address family" @@ -540,5 +530,5 @@ end if $0 == __FILE__ - eval DATA.read + eval DATA.read, nil, $0, __LINE__+4 end
-- --- 僕の前にBugはない。 --- 僕の後ろにBugはできる。 中田 伸悦