# class Resolv::IPv6

A `Resolv::DNS` `IPv6` address.

### Constants

Regex

  A composite `IPv6` address `Regexp`.

Regex_6Hex4Dec

  `IPv4` mapped `IPv6` address format a:b:c:d:e:f:w.x.y.z

Regex_8Hex

  `IPv6` address format a:b:c:d:e:f:g:h

Regex_CompressedHex

  Compressed `IPv6` address format a::b

Regex_CompressedHex4Dec

  Compressed `IPv4` mapped `IPv6` address format a::b:w.x.y.z

### Attributes

address[R]

The raw `IPv6` address as a `String`.

### Public Class Methods

create(arg) click to toggle source

Creates a new `IPv6` address from `arg` which may be:

`IPv6`

  returns `arg`.

`String`

  `arg` must match one of the IPv6::Regex* constants

    # File lib/resolv.rb, line 2472
    def self.create(arg)
      case arg
      when IPv6
        return arg
      when String
        address = ''.b
        if Regex_8Hex =~ arg
          arg.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
        elsif Regex_CompressedHex =~ arg
          prefix = $1
          suffix = $2
          a1 = ''.b
          a2 = ''.b
          prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
          suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
          omitlen = 16 - a1.length - a2.length
          address << a1 << "\0" * omitlen << a2
        elsif Regex_6Hex4Dec =~ arg
          prefix, a, b, c, d = $1, $2.to_i, $3.to_i, $4.to_i, $5.to_i
          if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
            prefix.scan(/[0-9A-Fa-f]+/) {|hex| address << [hex.hex].pack('n')}
            address << [a, b, c, d].pack('CCCC')
          else
            raise ArgumentError.new("not numeric IPv6 address: " + arg)
          end
        elsif Regex_CompressedHex4Dec =~ arg
          prefix, suffix, a, b, c, d = $1, $2, $3.to_i, $4.to_i, $5.to_i, $6.to_i
          if (0..255) === a && (0..255) === b && (0..255) === c && (0..255) === d
            a1 = ''.b
            a2 = ''.b
            prefix.scan(/[0-9A-Fa-f]+/) {|hex| a1 << [hex.hex].pack('n')}
            suffix.scan(/[0-9A-Fa-f]+/) {|hex| a2 << [hex.hex].pack('n')}
            omitlen = 12 - a1.length - a2.length
            address << a1 << "\0" * omitlen << a2 << [a, b, c, d].pack('CCCC')
          else
            raise ArgumentError.new("not numeric IPv6 address: " + arg)
          end
        else
          raise ArgumentError.new("not numeric IPv6 address: " + arg)
        end
        return IPv6.new(address)
      else
        raise ArgumentError.new("cannot interpret as IPv6 address: #{arg.inspect}")
      end
    end

### Public Instance Methods

to_name() click to toggle source

Turns this `IPv6` address into a `Resolv::DNS::Name`.

    # File lib/resolv.rb, line 2547
    def to_name
      return DNS::Name.new(
        @address.unpack("H32")[0].split(//).reverse + ['ip6', 'arpa'])
    end