**以前のリビジョンの文書です**
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()
