使用Python 2.7.x中的所有可打印字符对IP地址进行编码

时间:2016-07-28 09:38:19

标签: python

我想使用所有可打印字符以尽可能短的字符串对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'。

2 个答案:

答案 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"))