我想使用所有可打印字符以尽可能短的字符串对IP地址进行编码。根据{{3}},这些是代码20hex到7Ehex。
例如:
shorten("172.45.1.33") --> "^.1 9" maybe.
为了使解码变得容易,我还需要编码的长度始终相同。我还想避免使用空格字符,以便将来更容易解析。
怎么能这样做?
我正在寻找适用于Python 2.7.x的解决方案。
到目前为止,我尝试修改Eloims在Python 2中工作的答案:
首先,我为Python 2安装了ipaddress backport(https://en.wikipedia.org/wiki/ASCII#Printable_characters)。
#This is needed because ipaddress expects character strings and not byte strings for textual IP address representations
from __future__ import unicode_literals
import ipaddress
import base64
#Taken from http://stackoverflow.com/a/20793663/2179021
def to_bytes(n, length, endianess='big'):
h = '%x' % n
s = ('0'*(len(h) % 2) + h).zfill(length*2).decode('hex')
return s if endianess == 'big' else s[::-1]
def def encode(ip):
ip_as_integer = int(ipaddress.IPv4Address(ip))
ip_as_bytes = to_bytes(ip_as_integer, 4, endianess="big")
ip_base85 = base64.a85encode(ip_as_bytes)
return ip_base
print(encode("192.168.0.1"))
现在失败了,因为base64没有属性'a85encode'。
答案 0 :(得分:5)
以二进制存储的IP是4个字节。
您可以使用Base85将其编码为5个可打印的ASCII字符。
使用更多可打印字符将无法缩短生成的字符串。
import ipaddress
import base64
def encode(ip):
ip_as_integer = int(ipaddress.IPv4Address(ip))
ip_as_bytes = ip_as_integer.to_bytes(4, byteorder="big")
ip_base85 = base64.a85encode(ip_as_bytes)
return ip_base85
print(encode("192.168.0.1"))
答案 1 :(得分:2)
我发现这个问题正在寻找在python 2上使用base85 / ascii85的方法。最后我发现了几个可以通过pypi安装的项目。我选择了一个名为hackercodecs
的项目,因为该项目专门用于编码/解码,而我发现的其他项目只是将实施作为必需品的副产品
from __future__ import unicode_literals
import ipaddress
from hackercodecs import ascii85_encode
def encode(ip):
return ascii85_encode(ipaddress.ip_address(ip).packed)[0]
print(encode("192.168.0.1"))