差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
次のリビジョン | 前のリビジョン | ||
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> | ||