首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Base64解码,直到没有Base64为止

Base64解码,直到没有Base64为止
EN

Stack Overflow用户
提问于 2010-10-22 23:23:25
回答 4查看 3.4K关注 0票数 1

所以我的问题很简单,我想。我需要解码Base64直到没有Base64,我检查RegEx是否有一些Base64,但我不知道如何解码,直到没有Base64。

在这段简短的代码中,我可以解码Base64,直到没有Base64为止,因为我的文本是定义的。(直到Base64解码内容不是"Hello World“解码)

代码语言:javascript
复制
# Import Libraries
from base64 import *
import re

# Text & Base64 String
strText = "Hello World"
strEncode = "VmxSQ2ExWXlUWGxUYTJoUVVqSlNXRlJYY0hOT1ZteHlXa1pLVVZWWE9EbERaejA5Q2c9PQo=".encode("utf-8")

# Decode
objRgx = re.search('^(?:[A-Za-z0-9+/]{4})*(?:[A-Za-z0-9+/]{2}==|[A-Za-z0-9+/]{3}=)?$', strEncode.decode("utf-8"))

strDecode = b64decode(objRgx.group(0).encode("utf-8"))

print(strDecode.decode("utf-8"))

while strDecode != strText.encode("utf-8"):
    strDecode = b64decode(strDecode)

    print(strDecode.decode("utf-8"))

有谁知道如何解码Base64直到有真正的文本(不再有base64)

另外,我为我糟糕的英语感到抱歉。

EN

回答 4

Stack Overflow用户

发布于 2010-10-22 23:29:34

你不能,不是在任意的意义上。问题很简单,日常的单词也可以是BASE64的。因此,没有真正的方法来区分这两者之间的区别。

除了长度,BASE64没有终止符。它可以用=或==终止,但不一定要终止。=只是填充而已。不需要填充,那么就不需要=。因此,BASE64可能会结束,一些文本将开始,而您无法检测到它。

编辑为“所以真的没有办法做我想做的事?”:

不,不是确定性的,不是可靠的。即使使用启发式,也可能会出现失败的情况,最终会消耗太多字符,导致二进制块末尾出现垃圾,并丢失后续文本流中的字符。

现在,这是针对任意BASE64块的。如果你知道二进制数据是什么,那么也许还有希望。

例如,如果您知道二进制数据是什么,那么大多数二进制格式“知道”它们何时“完成”。我不知道有效的二进制格式是“读到EOF”。它们通常使用内部描述符“这就是下一个块有多少数据”,或者使用终止符来表示“我完成了”。

在这些情况下,您可以将BASE64视为流。BASE64基本上是非常简单的。它获取3个字节,并将它们转换为4个字符。

因此,B64流读取器只需读取4个字符并返回它们所代表的3个字节。

比如说,如果你有一个PNG阅读器,它就可以开始读取转换后的流。当它“完成”时,它会“关闭”流,您的原始文本就是“在BASE64的末尾”。

如果你知道原始附件的大小,它也可以工作。如果有人发送了"10,000字节“,那么您可以使用BASE64流解码器并简单地从其中读取"10,000”字节。

通常,您将使用带有=或==终止符的BASE64。在你不知道的情况下,这是一个问题。解码后的流可以以任意一种方式工作。

如果您不知道附件的原始大小或编码后的二进制文件的格式,那么您就很不幸了。

票数 7
EN

Stack Overflow用户

发布于 2010-10-22 23:27:06

作为启发式,您可以计算结果中的平均词长。自然语言会有一些简短的单词,比如“作为启发式,你可以看看单词的长度。”仍然是Base64编码的字符串将只有很少的空格和空格之间的长字符串。

作为另一种启发式方法,您可以计算元音(a,e,i,o,u)与辅音的比例或单词中间的大写字母数。

票数 2
EN

Stack Overflow用户

发布于 2010-10-22 23:41:34

所以您要处理的数据块可能是重复使用base64编码的?那么,为什么不直接通过b64decode()循环字符串直到它出错呢?

此外,我认为您可能不需要到处散布如此多的.encode("utf-8")

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3998319

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档