使用 Python 将非常长的二进制字符串编码为可恢复的简单形式的最佳方法?
Best way to encode a very long binaries string to a revertable simple form using Python?
------------------------添加新的---------------- ------------
让我在这里填写更多信息:
实际情况是我在环境-A中有这个LONG STRING,需要复制粘贴到环境-B中;
不幸的是,envir-A 和 envir-B 没有连接(没有相互访问),所以我正在考虑一种方法 encode/decode 来表示它,否则对于更多文件我必须输入手工串串----速度慢且不可重现。
有什么建议或推荐的小工具吗?
非常感谢!
我遇到了一个奇怪的问题,要将 SUPER LONG 二进制文件编码成简单的形式,比如几个数字。
比如说,有一个很长的字符串,只有1和0,例如长度为 1,000 到 100,000 甚至更多数字的“110...011”,我想将此字符串编码为更少 digits/chars 的内容。然后我需要将它反转回原来的 STRING。
目前我正在尝试使用 Python 中的 hex / int 方法来 'compress' 这个字符串,然后 'decompress' 将它恢复到原来的形式。
一个例子是:
1.input 字符串:'110011110110011'
'''
def Bi_to_Hex_Int(input_str, method ):
#2to16
if method=='hex':
string= str(input_str)
input_two= string
result= hex(int(input_two,2))
#2to10
if method=='int':
string= str(input_str)
input_two= string
result= int(input_two,2)
print("input_bi length",len(str(input_two)), "\n output hex length",len(str(result)),'\n method: {}'.format(method) )
return result
res_16 =Bi_to_Hex_Int(gene , 'hex')
=='0x67b3'
res_10 =Bi_to_Hex_Int(gene , 'int')
== 26547
'''
那我就可以反过来了:
'''
def HexInt_to_bi(input_str , method):
if method =='hex':
back_two = bin(int(input_str,16))
back_two = back_two[2:]
if method =='int':
back_two = bin( int(input_str ))
back_two = back_two[2:]
print("input_hex length",len(str(input_str)), "\n output bi length",len(str(back_two)) )
return back_two
hexback_two = HexInt_to_bi(res_16, 'hex')
intback_two = HexInt_to_bi(res_10 , 'int')
'''
但是,这确实有问题,我尝试了大约 500 位 String:101010...0001(500d),最好的 'compressed' 结果是大约 127 位十六进制;
那么有没有更好的方法来进一步 'compress' 字符串到更少的数字?
**假设 5,000 位字符串由 1 和 0 组成,压缩到 50/100 的东西 digits/chars(甚至更低)** ??
如果你想要这么简单,比如说 1 个十六进制字符压缩 4 个二进制字符 (2 ^ 4 = 16)。你要的压缩比大概是100 / 50倍。 50 次你需要将 50 个二进制字符压缩成 1 个字符,这意味着你需要 2 ^ 50 个不同的字符来编码任何组合。相当多。
如果您接受较低的比率,您可以像 here 中描述的那样尝试 base64。它的压缩比是6比1。
否则你必须想出一些复杂的算法,比如将你的字符串分成块,在它们之间寻找相似之处,用不同的符号对它们进行编码,构建这些符号的映射等。
使用 archivator 压缩字符串可能更容易,然后 return 结果的 base64 表示形式。
如果任务允许,您可以将整个字符串存储在某处并为它们指定简短的唯一名称,因此您必须按名称存储和检索字符串,而不是压缩和解压缩。
如果字符串由仅个0
和1
个数字组成,那么您可以将八个数字打包成一个字节。您还需要跟踪最后一个八的倍数之后有多少位数字,因为最后一个字节可能表示少于八位数字。
这可能不会生成您可以获得的绝对最短的字符串,但使用 Python 中内置的工具非常容易。无需将字符转换为二进制格式,zlib
压缩会将只有 2 个不同字符的输入转换为最佳格式。
编码:
import zlib
import base64
result = base64.b64encode(zlib.compress(input_str.encode()))
如果 0
和 1
的计数明显不同,您可以使用枚举编码来获得最短表示
------------------------添加新的---------------- ------------
让我在这里填写更多信息:
实际情况是我在环境-A中有这个LONG STRING,需要复制粘贴到环境-B中;
不幸的是,envir-A 和 envir-B 没有连接(没有相互访问),所以我正在考虑一种方法 encode/decode 来表示它,否则对于更多文件我必须输入手工串串----速度慢且不可重现。
有什么建议或推荐的小工具吗? 非常感谢!
我遇到了一个奇怪的问题,要将 SUPER LONG 二进制文件编码成简单的形式,比如几个数字。
比如说,有一个很长的字符串,只有1和0,例如长度为 1,000 到 100,000 甚至更多数字的“110...011”,我想将此字符串编码为更少 digits/chars 的内容。然后我需要将它反转回原来的 STRING。
目前我正在尝试使用 Python 中的 hex / int 方法来 'compress' 这个字符串,然后 'decompress' 将它恢复到原来的形式。
一个例子是:
1.input 字符串:'110011110110011'
'''
def Bi_to_Hex_Int(input_str, method ):
#2to16
if method=='hex':
string= str(input_str)
input_two= string
result= hex(int(input_two,2))
#2to10
if method=='int':
string= str(input_str)
input_two= string
result= int(input_two,2)
print("input_bi length",len(str(input_two)), "\n output hex length",len(str(result)),'\n method: {}'.format(method) )
return result
res_16 =Bi_to_Hex_Int(gene , 'hex')
=='0x67b3'
res_10 =Bi_to_Hex_Int(gene , 'int')
== 26547
'''
那我就可以反过来了:
'''
def HexInt_to_bi(input_str , method):
if method =='hex':
back_two = bin(int(input_str,16))
back_two = back_two[2:]
if method =='int':
back_two = bin( int(input_str ))
back_two = back_two[2:]
print("input_hex length",len(str(input_str)), "\n output bi length",len(str(back_two)) )
return back_two
hexback_two = HexInt_to_bi(res_16, 'hex')
intback_two = HexInt_to_bi(res_10 , 'int')
'''
但是,这确实有问题,我尝试了大约 500 位 String:101010...0001(500d),最好的 'compressed' 结果是大约 127 位十六进制;
那么有没有更好的方法来进一步 'compress' 字符串到更少的数字?
**假设 5,000 位字符串由 1 和 0 组成,压缩到 50/100 的东西 digits/chars(甚至更低)** ??
如果你想要这么简单,比如说 1 个十六进制字符压缩 4 个二进制字符 (2 ^ 4 = 16)。你要的压缩比大概是100 / 50倍。 50 次你需要将 50 个二进制字符压缩成 1 个字符,这意味着你需要 2 ^ 50 个不同的字符来编码任何组合。相当多。
如果您接受较低的比率,您可以像 here 中描述的那样尝试 base64。它的压缩比是6比1。
否则你必须想出一些复杂的算法,比如将你的字符串分成块,在它们之间寻找相似之处,用不同的符号对它们进行编码,构建这些符号的映射等。
使用 archivator 压缩字符串可能更容易,然后 return 结果的 base64 表示形式。
如果任务允许,您可以将整个字符串存储在某处并为它们指定简短的唯一名称,因此您必须按名称存储和检索字符串,而不是压缩和解压缩。
如果字符串由仅个0
和1
个数字组成,那么您可以将八个数字打包成一个字节。您还需要跟踪最后一个八的倍数之后有多少位数字,因为最后一个字节可能表示少于八位数字。
这可能不会生成您可以获得的绝对最短的字符串,但使用 Python 中内置的工具非常容易。无需将字符转换为二进制格式,zlib
压缩会将只有 2 个不同字符的输入转换为最佳格式。
编码:
import zlib
import base64
result = base64.b64encode(zlib.compress(input_str.encode()))
如果 0
和 1
的计数明显不同,您可以使用枚举编码来获得最短表示