微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

使用 Python 将很长的二进制字符串编码为可恢复的简单形式的最佳方法?

如何解决使用 Python 将很长的二进制字符串编码为可恢复的简单形式的最佳方法?

--------------------------- 添加新------------------- ----------

让我在这里填写更多信息:

实际情况是我在环境-A中有这个LONG STRING,需要复制粘贴到环境-B;

不幸的是,environ-A 和environ-B 没有连接(不能相互访问),所以我正在考虑一种编码/解码的方法来表示它,否则对于更多的文件,我必须手动输入字符串----这是缓慢且不可重现的。

有什么建议或小工具推荐吗? 非常感谢!


我在将 SUPER LONG 二进制文件编码为简单形式(如几个数字)时遇到了一个奇怪的问题。

比如说,有一个长字符串只由 1 和 0 组成,例如长度为 1,000 到 100,000 甚至更多数字的“110...011”,我想将此字符串编码为具有较少数字/字符的内容。然后我需要将其反转回原来的 STRING。

目前我正在尝试在 Python 中使用 hex / int 方法来“压缩”这个字符串,然后将它“解压缩”回原始形式。

一个例子是:

1.输入字符串:'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 位字符串:101010...0001(500d),最好的“压缩”结果是大约 127 位十六进制数;

那么有没有更好的方法可以将字符串进一步“压缩”为更少的数字?

**假设 5,000 位字符串由 1s&0s 组成,压缩到 50/100 位数字/字符(甚至更低)** ??

解决方法

如果你想要它那么简单,比如说 1 个十六进制字符压缩 4 个二进制字符 (2 ^ 4 = 16)。你想要的压缩比大约是 100 / 50 倍。 50 次您需要将 50 个二进制字符压缩为 1 个字符,这意味着您需要 2 ^ 50 个不同的字符来编码任何组合。相当多。

如果您接受较低的比率,您可以尝试像 here 所述的 base64。其压缩比为 6 比 1。

否则你必须想出一些复杂的算法,比如将你的字符串分成块,在它们之间寻找相似之处,用不同的符号对它们进行编码,构建这些符号的映射等。

可能用 archivator 压缩字符串更容易,然后返回结果的 base64 表示。

如果任务允许,您可以将整个字符串存储在某个地方,并为它们指定简短的唯一名称,因此您必须按名称存储和检索字符串,而不是压缩和解压缩。

,

这可能不会产生您可以获得的绝对最短的字符串,但是使用 Python 内置的工具非常容易。无需将字符转换为二进制格式,zlib 压缩会将只有 2 个不同字符的输入转换为最佳格式。

编码:

import zlib
import base64
result = base64.b64encode(zlib.compress(input_str.encode()))
,

如果 01 的计数显着不同,您可以使用枚举编码来获得最短表示

,

如果字符串01数字组成,那么您可以将八位数字打包成一个字节。您还需要跟踪最后一个 8 的倍数之后有多少位数字,因为最后一个字节可能表示少于 8 位数字。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。