**以前のリビジョンの文書です**

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()
programming/python/rfc5952.1327234637.txt.gz · 最終更新: 2012/01/22 21:17 by yuki
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0