0

如何在 base64 中编码二进制文件并且每行有 72 个字符?

这是我尝试过的,但它不起作用,我不知道我是否正确格式化输出以便对其进行解码。

import base64

fin = open("/Users/kyle/one_time_pad/encrypt/cipher_text.txt", "rb")
binary_data = fin.read()
fin.close()

b64_data = base64.b64encode(binary_data)
file = b64_data

def split_len(seq, length):
    return [seq[i:i+length] for i in range(0, len(seq), length)]

def organize():
    for a in split_len(file, 72):
        print a

open("/Users/kyle/Desktop/test.txt", "w").write(organize())

它给出了错误TypeError: expected a character buffer object

4

2 回答 2

2

在尝试重新实现轮子之前,总是值得略读 stdlib。该textwrap模块非常适合此目的:

file = b64_data
file72 = textwrap.fill(b64_data, 72)
open("/Users/kyle/Desktop/test.txt", "w").write(file72)

您现有的代码有两个问题。

首先,您正在从 中创建一个字符串列表split_len,但尝试将其写为带有 的单个字符串write

其次,你的organize函数试图解决这个问题……但它实际上并没有返回任何东西,它只是打印出一堆东西,所以实际上传递给write的是None.

无论如何,您需要将这些值实际累积到某些东西中。你可以明确地做到这一点:

def organize(f):
    result = ''
    for a in split_len(f, 72):
        if result: result += '\n'
        result += a

…或者您可以再次使用随附的电池并寻找已经执行此操作的功能:

def organize(f):
    return '\n'.join(f)

或者,您可以write每次通过循环执行一次:

with open("/Users/kyle/Desktop/test.txt", "w") as f:
    for a in split_len(file, 72):
        f.write(a + '\n')

或者您可以将其保留为列表并writelines使用该列表进行调用(但是您必须进行更改split_len,以便\n在每行的末尾添加,或者调用writelines为您执行此操作的理解)。


一些旁注:

打开文件时,您应该始终关闭它们,并且使用with语句可以更容易:

with open("/Users/kyle/Desktop/test.txt", "w") as f:
    f.write(file72)

一般来说,像你organize这样的函数只是对你只会调用一次的全局变量做一些事情并没有任何帮助,因为它不比仅仅运行内联代码更可重用。如果您希望它可重用(和可调试等),请让它接受一个参数。如果您不需要它可重用,只需将其写入内联即可。

于 2013-08-26T23:46:17.677 回答
2
def organize():
    return "\n".join(split_len(file, 72))

应该返回一个字符串,这write是期望的

附带说明一下,这样做可能会更好

with open(filename,"w") as f:
        f.write(organize())

因为这将确保文件在完成后关闭(尽管您的版本可能会很快被垃圾收集)

于 2013-08-26T23:21:56.203 回答