差分
この文書の現在のバージョンと選択したバージョンの差分を表示します。
両方とも前のリビジョン 前のリビジョン 次のリビジョン | 前のリビジョン 次のリビジョン 両方とも次のリビジョン | ||
programming:python:rfc5952 [2012/01/22 21:14] yuki |
programming:python:rfc5952 [2012/12/05 22:22] yuki |
||
---|---|---|---|
ライン 1: | ライン 1: | ||
====== RFC5952 ====== | ====== 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 | + | >>> import rfc5952 |
+ | >>> binary = '\x20\x01\x0d\xb8\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01' | ||
+ | >>> rfc5952.inet6_ntoa(binary) | ||
+ | '2001:db8::1' | ||
+ | >>> string = "2001:db8:1f1f:90::82" | ||
+ | >>> rfc5952.inet6_aton(string) | ||
+ | ' \x01\r\xb8\x1f\x1f\x00\x90\x00\x00\x00\x00\x00\x00\x00\x82' | ||
- | def ipv6_rfc5952(addr_hex): | + | Bitbucketで公開してます。 |
- | 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 | + | * https://bitbucket.org/ainoniwa/rfc5952/src/dcb12192d35f730d843f2922e0d0b75f702d2092/rfc5952.py |
- | # 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> | + | |