base64 问题

南柯下的淳于棼 2018-11-29 02:50:56
问题如下:
对一个tgz文件进行base64 encode. 然后对其decode ,得到文件后进行解压,再对解压出来的文件打包(与原tgz文件名相同)。再次 encode... , 为什么两次encode的base64编码会不同。

a.log 内容(第一次encode 的base64编码):
H4sICPJvt1kC/3JwLnRnegDtGF1v2zbQzwP2HzQhD9sDLclO3NSQlXVtUmzrsqJNNmwvBiNRMgdJJEjKSf79jvr+sJM6aDqs0Bmwfcf75t2REhHUl5Kl07sknjwT2ACLxXH+C9D7dWDxZOLMnZOTxeLFi8VsYjvzY8eZGPbkC0AmFRaGMRGMqYf4HlvvB/c/AfcMNt7YEiEpS1emM7VN48z79hvXZ2lIIwNWU7kyN0rxpWUpTGMUTn2WWKm0ChZLy4CEYWgZRe6UrKQykS5FkMolCCxJWWlLhpOEBSSuKaiSQ5QzWegCbZKILfVJiQIhyWJFeUxqfk+JjLjWkF5qsNoqXKuz7GLJD/UTRMBFUXsYkBCD7TXQ11gp0bg6WElwiiOSkFRZjmvtF5SbTAXsNvVCHEuIrcarkHaKuhagz7EHJfWJyjq6Gm0oxQnxYubjuN6UglZzxiyKaBodaleLEdEzWxiWLCZVUiu0NmeV9hoK5W35gCWYprmPh7oELAN/QGMe7vWHd0bIhPHm8qOxIQI862Qh3+7GcpsOQ0tRHwmWqYM9asvuco1yxAUJ6Z1nT/OPZbtWQ+yGobduwzhS95x4NYaDQBApIZ7O+k5Rz3k5mzqL06lzejo9tRuZLntApC8oVzCmvI/nH/74+fW5cXl+pRuiWWhnrh1ma6dbG1tNmIMTWIgNy0yGque1ZiXC6jrW5XIBRX5M9WjoKJObx3Tpyh4KWl1JV5E4JeqJugbCrvT5U/1qSXZnc2s675zVFBARYp90xholKlxyLHAil0Bews7d4zTK6agRqYdZTWq8yPsqiRL1YzmOumNIV21hcUlhgNNQPWIZmBAN82o3vVJkSfkFE7dYBJDOdhu48bxx89AibOJDw0nbzNremG1z0N4+lk3bIZZk6H2aYHHfWytXux18bM1ewnmk6T1N1l5VxVLfuCtZJqDP9jjG8p6XQ59kmnBrB1ludlCh+6yBo7tUQ8Xuc6c7Vaz2ttblPaDsrcb6pvA81UgUHDXQ069lgv1BSZIU38QkKG9WFdYsl8KHVmslt7tWb2gaoGE+qjSFaNCmDXXI7Ks7r82m8fZe7bEG0ZZO7tmzFl6OJXkvFUk+eSQV7PU4whnYS+GMwp2zy81gMrYdzsOsMjm8InAs5S0TQYulJjWxtZRCs+2y7G6YVLnyv96h7ds/0bU9c62aWGSgCKFAUux/euyQVv24gECmTkAEZzNv+qjA90aOZMY5E2qYAR1bUQzndQoaWpODrv495ooIockTmj5kinw2U5L4maDq/ovYJDxC/gYLfdv9YgZjfBtmcdFzPuHqcxousbIjLV2UX9/znW5zxuJGjcZQlV+NQNPXpP79VvP071tFgnpuVw+R2o/aXkV2y+d9+DsZ4WsBshVTva/PaePh93+2Y88Xvfd/sxN7Pr7/+6/e/5HUZwGcDyvz+uoCnZpn1VA4T7ckZvV10f0OoWqavGb8XtBoo4zv/R+Mme2cIPh6YVQnsvHqp2nF+yqOjZxXGnCR1k+PQbmGUKX6vaBbGpOIXAODcQljbWWu82PDMY335f1mZR45R3ZkS3/zjzqKwpsoCab05O/z33+ZX/y2ZW9/3U7N6nbv3vB1QkRE1vk5lOK4vOQO6aVAgu/WaZasY38tYwbPonPbtQbEknl7gW/ew/XEuMySGyJW5sw0ruBqvTKloGwLbhhGyQrjeO1ro4nnLOanx3DzbChdHp9n3qJe11hrnQ908IEOXkg5ds2g0doVHYI3h3te/qea/fU+j/NxhBFGGGGEEUYYYYQRRhhhhBG+BvgXgLSc7gAoAAA=



代码:
import base64
import tarfile
import sys
import os

# Read a.log decode base64 to evr.tgz
with open("a.log", "r") as fr:
with open("evr.tgz", "wb") as fw:
fw.write(base64.b64decode(fr.read()))

# untar evr.tgz
if os.path.exists("evr.tgz"):
tar = tarfile.open("evr.tgz")
tar.extractall()
tar.close()
os.remove(sys.path[0]+"\evr.tgz")

# tar ericsson.xml and evr.conf to new evr.tgz
wtar = tarfile.open("evr.tgz", "w:gz")
for dirpath,dirs,files in os.walk(sys.path[0]):
for filename in files:
if (filename == "ericsson.xml") or (filename == "evr.conf"):
wtar.add(filename)
os.remove(filename)
wtar.close()


# base64 encode evr.tgz to b.log
with open("evr.tgz", "rb") as f1:
with open("b.log", "w") as f2:
base64.encode(f1, f2)

os.remove(sys.path[0] + "\evr.tgz")

# compare a.log and b.log


...全文
429 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
charsm 2018-12-02
  • 打赏
  • 举报
回复
base64.b64encode() 将bytes类型数据进行base64编码,返回编码后的bytes类型字符串,
base64.b64deocde() 将base64编码的bytes类型进行解码,返回解码后的bytes类型
文件读取'r'与'rb'是有区别的:
1、读文件 进行读文件操作时,直到读到文档结束符(EOF)才算读取到文件最后,Python会认为字节\x1A(26)转换成的字符为文档结束符(EOF),故使用'r'进行读取二进制文件时,可能会出现文档读取不全的现象
2、 使用'r'的时候,如果碰到'0x1A',就视为文件结束,就是EOF。使用'rb'则不存在这个问题
因此,读取二进制文件要使用'rb' , 'wb'
混沌鳄鱼 2018-11-29
  • 打赏
  • 举报
回复
你把所有有文件打开方式都改成 二进制,要用'rb'/'wb' 不要用不带b的文本方式,会吃掉控制符的。

37,720

社区成员

发帖
与我相关
我的任务
社区描述
JavaScript,VBScript,AngleScript,ActionScript,Shell,Perl,Ruby,Lua,Tcl,Scala,MaxScript 等脚本语言交流。
社区管理员
  • 脚本语言(Perl/Python)社区
  • IT.BOB
加入社区
  • 近7日
  • 近30日
  • 至今

试试用AI创作助手写篇文章吧