Php 使用base64对大文件进行编码

Php 使用base64对大文件进行编码,php,encoding,base64,Php,Encoding,Base64,我正在尝试对一个文件进行编码/解码,该文件在base64编码中为数MBs,有时为数GBs,但有些数据以错误的方式进行编码/解码,导致出现奇怪的字符,如:� �̴ 我正在逐块读取文件编码,并分别保存每个文件(可能这就是问题所在,但我无法解决) 以下是我迄今为止所尝试的: <?php function encode_file($Ifilename, $Efilename){ $handle = fopen($Ifilename, 'rb'); $outHandle = fop

我正在尝试对一个文件进行编码/解码,该文件在base64编码中为数MBs,有时为数GBs,但有些数据以错误的方式进行编码/解码,导致出现奇怪的字符,如:� �̴

我正在逐块读取文件编码,并分别保存每个文件(可能这就是问题所在,但我无法解决)

以下是我迄今为止所尝试的:

<?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上的全部内容后,我发现每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不会以任何有意义的方式降低可读性。任何人都可以在没有密钥或任何特殊知识的情况下对数据进行base64解码。如果您试图混淆某些内容,这是一种非常无效的方法。base64_编码不是逐位操作,因此您的文件现在已损坏。@RobbyCornelissen-nope。它是以非二进制(ascii)格式传输二进制数据。这仍然不能以任何方式保护您的数据。谁说了关于保护的事情?您确实说过,在一篇关于以下问题的内容中:“我知道,目标只是降低可读性”。Base64与混淆无关。它是关于使用有限的字符集对数据进行编码(通常是二进制的),以便通过需要文本的协议进行传输。此外,您仍然在调用函数
encrypt\u file
decrypt\u file
。这是一个巨大的赠品,你试图阻止人们阅读数据。你选错了工具。这就像试图通过将一本小说翻译成法语来保护它。谢谢你,我认为这是一个困惑,我的问题是如何去做,而不是为什么去做。如果你有一个答案,我将很高兴与你讨论它与其他人,我明确表示,我知道什么是base64和它的功能,但我仍然想使用它。