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

RFC5952

簡単にバイナリ to RFC5952表記な文字列に変換してみるコード。全部ちゃんと動くのか若干自信ない。

<code>

-*- 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 ipv6rfc5952(addrhex):

  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 ipv6a2s(addrhex):

  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()

<code>

programming/python/rfc5952.1327234446.txt.gz · 最終更新: 2012/01/22 21:14 by yuki
CC Attribution-Noncommercial-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0