0

您好,感谢您的阅读。我在使用 base64 解码以前编码的文件时遇到了一些问题。例如,假设我想使用 base64 编码一个 pdf 文件。结果是一个很好的 80 字符分隔的字符串系列。进行编码的代码(摘自此板)既好又简单:

    def encode_file_base64(bin_input):
      flag = 0
      try:
        with open(bin_input, 'rb') as fin, open('tmp.bin_hex', 'w') as fout:
        base64.encode(fin, fout)
      except:
        traceback.print_exc()
        flag = -1
      return flag 

现在解码功能:

    def decode_file_base64(bin_output):
      flag = 0
      try:
        with open('tmp.bin_hex', 'rb') as fin, open(bin_output, 'w') as fout:
          base64.decode(fin, fout)
      except:
          traceback.print_exc()
          flag = -1
      return flag

它可以完成这项工作,但是当我尝试打开输出文件时,我无法打开并且文件似乎“损坏”。我一直在努力解决这个问题,我即将放弃。我想我可以使用其他类型的编码,但 BOSS 坚持使用 base64(他一定听说过它是最好的......)。

4

1 回答 1

3

我不知道这是否是您的问题(我什至不知道您的问题是什么),但是如果您在二进制模式有所不同的平台/版本/实现上,那么您做错了:

with open('tmp.bin_hex', 'rb') as fin, open(bin_output, 'w') as fout:

您正在以二进制模式打开文本文件(您以文本模式编写的 b64 文件),并以文本模式打开二进制文件。尝试这个:

with open('tmp.bin_hex', 'r') as fin, open(bin_output, 'wb') as fout:

同时,出于调试目的,您可能希望尝试将文件与编码和解码的结果进行比较。例如,如果您看到新文件稍长一些,而 hexdump 显示这是因为每个 0x0A 字节已被两个 0x0D 0x0A 字节替换,您就知道问题在于您正在翻译换行符,即反过来意味着您处于文本模式。

于 2013-04-09T22:12:44.147 回答