| Class | IP::V6 |
| In: |
lib/ip/base.rb
lib/ip/socket.rb |
| Parent: | IP |
| PROTO | = | "v6".freeze |
| ADDR_BITS | = | 128 |
| MASK | = | (1 << ADDR_BITS) - 1 |
| AF | = | Socket::AF_INET6 |
| orig_new | -> | new |
Parse a string; return an V6 instance if it‘s a valid IPv6 address, nil otherwise
# File lib/ip/base.rb, line 284
284: def self.parse(str)
285: case str
286: when /\A\[?::(ffff:)?(\d+\.\d+\.\d+\.\d+)\]?(?:\/(\d+))?(?:@(.*))?\z/i
287: mapped = $1
288: pfxlen = ($3 || 128).to_i
289: ctx = $4
290: return nil if pfxlen > 128
291: v4 = (V4.parse($2) || return).to_i
292: v4 |= 0xffff00000000 if mapped
293: new(v4, pfxlen, ctx)
294: when /\A\[?([0-9a-f:]+)\]?(?:\/(\d+))?(?:@(.*))?\z/i
295: addr = $1
296: pfxlen = ($2 || 128).to_i
297: return nil if pfxlen > 128
298: ctx = $3
299: return nil if pfxlen > 128
300: if addr =~ /\A(.*?)::(.*)\z/
301: left, right = $1, $2
302: l = left.split(':')
303: r = right.split(':')
304: rest = 8 - l.length - r.length
305: return nil if rest < 0
306: else
307: l = addr.split(':')
308: r = []
309: rest = 0
310: return nil if l.length != 8
311: end
312: out = ""
313: l.each { |quad| return nil if quad.length>4; out << quad.rjust(4,"0") }
314: rest.times { out << "0000" }
315: r.each { |quad| return nil if quad.length>4; out << quad.rjust(4,"0") }
316: new(out, pfxlen, ctx)
317: else
318: nil
319: end
320: end
Return just the address part as a String in compact decimal form
# File lib/ip/base.rb, line 323
323: def to_addr
324: if ipv4_compat?
325: "::#{native.to_addr}"
326: elsif ipv4_mapped?
327: "::ffff:#{native.to_addr}"
328: else
329: res = to_hex.scan(/..../).join(':')
330: res.gsub!(/\b0{1,3}/,'')
331: res.gsub!(/(\A|:)(0:)+/,'::')
332: res.gsub!(/::0\z/, '::')
333: res
334: end
335: end