差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
| 両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン | ||
|
programming:python:rfc5952 [2012/01/22 21:14] yuki |
— (現在) | ||
|---|---|---|---|
| ライン 1: | ライン 1: | ||
| - | ====== 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 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() | ||
| - | </code> | ||
