**以前のリビジョンの文書です**
RFC5952
簡単にバイナリ to RFC5952表記な文字列に変換してみるコード。全部ちゃんと動くのか若干自信ない。
# -*- coding: utf-8 -*- #------------------------------------------------------------------------------- # Name: module1 # Purpose: # # Author: ruy # # Created: 21/01/2012 # Copyright: (c) ruy 2012 # Licence: BSD #------------------------------------------------------------------------------- #!/usr/bin/env python import binascii def ipv6_rfc5952(addr_hex): s = '' octets = [] if len(addr_hex)==16: start, point, length = 0, -1, 0 for n in xrange(8): # RFC5952 section 1 octets.append( binascii.b2a_hex(addr_hex[n<<1:(n+1)<<1]).lstrip('0') ) if octets[n] is not '': temp = octets[start:].count('0') if temp > length: point = start+1 length = temp start = n else: octets[n] = '0' # RFC5952 section 2 # RFC5952 section 4 if octets.count('0') == 8: s = '::' else: if point != -1: for n in xrange(length): octets.pop(point) octets.insert(point,'') s = ':'.join(octets) # RFC5952 section 3 if s.count(':') == 7 and s.count('::') == 1: s = ':0:'.join(s.rsplit('::')) # RFC5952 section 5 return s.lower() def ipv6_a2s(addr_hex): s = '' if len(addr_hex)==16: for n in xrange(8): s += binascii.b2a_hex(addr_hex[n*2:(n+1)*2]) + ':' return s.rstrip(':') def main(): # 2001:db8::1 ipv6_addr =['\x20\x01\x0d\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', # :: '\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00', # 1::1 '\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', # fe80:1:1:1:1:1:1:1 '\xfe\x80\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01\x00\x01', # fe80:1::1:0:0:0:1 '\xfe\x80\x00\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01', # 2001::1:1 '\x20\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x01', # 2001::1:0:1 '\x20\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x01', # 2001::1:0:0:1 '\x20\x01\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x01', # 2001:0:0:1::1 '\x20\x01\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x01', # 2001:0:1::1 '\x20\x01\x00\x00\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', # 2001:1::1 '\x20\x01\x00\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01', # 1000:100:10:1:1:10:100:1000 '\x10\x00\x01\x00\x00\x10\x00\x01\x00\x01\x00\x10\x01\x00\x10\x00', # 1000:100:10:1:0:10:100:1000 '\x10\x00\x01\x00\x00\x10\x00\x01\x00\x00\x00\x10\x01\x00\x10\x00'] for b in ipv6_addr: print ipv6_a2s(b) print ipv6_rfc5952(b) if __name__ == '__main__': main()