使用 base64 对大文件进行编码
Posted
技术标签:
【中文标题】使用 base64 对大文件进行编码【英文标题】:Encode a big file using base64 【发布时间】:2018-04-17 02:06:24 【问题描述】:我正在尝试以 base64 编码对几 MB 或有时 GB 的文件进行编码/解码,但是某些数据以错误的方式进行编码/解码,这会导致奇怪的字符,例如:�̴.
我正在通过块编码读取文件块并单独保存每个块(可能这是问题,但我无法弄清楚)。
这是我迄今为止尝试过的:
<?php
function encode_file($Ifilename, $Efilename)
$handle = fopen($Ifilename, 'rb');
$outHandle = fopen($Efilename, 'wb');
$bufferSize = 8151;
while(!feof($handle))
$buffer = fread($handle, $bufferSize);
$ebuffer = base64_encode($buffer);
fwrite($outHandle, $ebuffer);
fclose($handle);
fclose($outHandle);
function decode_file($Ifilename, $Efilename)
$handle = fopen($Ifilename, 'rb');
$outHandle = fopen($Efilename, 'wb');
$bufferSize = 8151;
while(!feof($handle))
$buffer = fread($handle, $bufferSize);
$dbuffer = base64_decode($buffer);
fwrite($outHandle, $dbuffer);
fclose($handle);
fclose($outHandle);
encode_file('input.txt', 'out.bin');//Big text file ~4MBs
decode_file('out.bin', 'out.txt');
【问题讨论】:
Base64 不是加密。它甚至不接近。你的目标是什么? 我知道,目标只是降低可读性 Base64 不会以任何有意义的方式降低可读性。任何人都可以在没有密钥或任何特殊知识的情况下对数据进行 base64 解码。如果您试图混淆某些内容,这是一种非常无效的方法。 base64_encode 不是逐位操作,因此您的文件现在已损坏。 @RobbyCornelissen - 不。它是以非二进制(ascii)格式传输二进制数据。 【参考方案1】:在base64上阅读整个Wikipedia article后,我发现每3个字符编码为4个base64字符,这就是导致文件损坏的原因。
解决方法是在编码时简单地将缓冲区设置为 n,其中 n 是 3 的倍数。
解码时设置缓冲区为 N,其中 N 是 4 的倍数。
工作代码:
<?php
function encode_file($Ifilename, $Efilename)
$handle = fopen($Ifilename, 'rb');
$outHandle = fopen($Efilename, 'wb');
$bufferSize = 3 * 256;// 3 bytes of ASCII encodes to 4 bytes of base64
while(!feof($handle))
$buffer = fread($handle, $bufferSize);
$ebuffer = base64_encode($buffer);
fwrite($outHandle, $ebuffer);
fclose($handle);
fclose($outHandle);
function decode_file($Ifilename, $Efilename)
$handle = fopen($Ifilename, 'rb');
$outHandle = fopen($Efilename, 'wb');
$bufferSize = 4 * 256; // 4 bytes of base64 decodes to 3 bytes of ASCII
while(!feof($handle))
$buffer = fread($handle, $bufferSize);
$dbuffer = base64_decode($buffer);
fwrite($outHandle, $dbuffer);
fclose($handle);
fclose($outHandle);
encode_file('input.txt', 'out.bin');
decode_file('out.bin', 'output.txt');
【讨论】:
这仍然不能以任何方式保护您的数据。 谁说过保护? 您在关于问题的内容中做到了:“我确实知道,目标只是降低可读性”。 Base64 与混淆无关。它是关于使用有限的字符集编码(通常是二进制)数据,以便通过需要文本的协议进行传输。 另外,您仍在调用您的函数encrypt_file
和decrypt_file
。这是一个巨大的赠品,你试图阻止人们阅读数据。您选择了错误的工具。这就像试图通过将小说翻译成法语来保护它。
谢谢,我认为有一个困惑,我的问题是如何做而不是为什么做。如果您有答案,我很乐意与您讨论,我明确表示我确实知道 base64 是什么以及它的作用,但我仍然想使用它。以上是关于使用 base64 对大文件进行编码的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Java 中加速读写 base64 编码的 gzip 大文件
如何在 Python 中对 PDF 文件进行 base64 编码