| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849 |
- # The contents of this file are subject to the Python Software Foundation
- # License Version 2.3 (the License). You may not copy or use this file, in
- # either source code or executable form, except in compliance with the License.
- # You may obtain a copy of the License at http://www.python.org/license.
- #
- # Software distributed under the License is distributed on an AS IS basis,
- # WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
- # for the specific language governing rights and limitations under the
- # License.
- from struct import pack, unpack
- from socket import inet_aton, inet_ntoa
- def compact(ip, port):
- return pack("!4sH", inet_aton(ip), port) # ! == "network order"
- # 4s == "4-byte string."
- # H == "unsigned short"
- def uncompact(x):
- ip, port = unpack("!4sH", x)
- return inet_ntoa(ip), port
- def uncompact_sequence(b):
- for x in xrange(0, len(b), 6):
- ip, port = uncompact(b[x:x+6])
- port = int(port)
- yield (ip, port)
- def compact_sequence(s):
- b = []
- for addr in s:
- c = compact(addr[0], addr[1])
- b.append(c)
- return ''.join(b)
- ##import ctypes
- ##class CompactAddr(ctypes.Structure):
- ## _fields_ = [('ip', ctypes.c_int32),
- ## ('port', ctypes.c_int16)]
- ##
- ##def compact_sequence_c(s):
- ## b = ctypes.create_string_buffer(6 * len(s))
- ## a = ctypes.addressof(b)
- ## for i, addr in enumerate(s):
- ## c = compact(addr[0], addr[1])
- ## ctypes.cast(
- ## offset = i*6
- ## b[offset:offset + 6] = c
- ## return b
|