Как читать N байтов из файла непрерывно до EOF - PullRequest
0 голосов
/ 05 июня 2019

Я пытаюсь преобразовать волну в базу 64.

Я пытаюсь использовать следующий фрагмент кода:

    vector<char> in(3);
    std::string out = "abcd";         //four letter garbage value as initializer
    ifstream file_ptr(filename.c_str(), ios::in | ios::binary);

    unsigned int threebytes = 0;
    //Apply the Base 64 encoding algorithm
    do {
        threebytes = (unsigned int) file_ptr.rdbuf()->sgetn(&in[0], 3);
        if (threebytes > 0) {
            EncodeBlock(in, out, (int)threebytes);  //Apply conversion algorithm to convert 3 bytes into 4
            outbuff = outbuff + out;                //Append the 4 bytes got from above step to the output
        }
    } while (threebytes == in.size());

    file_ptr.close();

В блоке кодирования, в котором записан алгоритм кодирования Base64

void EncodeBlock(const std::vector<char>& in, std::string& out, int len) {
    using namespace std;
    cb64 = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    out[0] = cb64[(int) (in[0] >> 2)];
    out[1] = cb64[(int) (((in[0] << 6) >> 2) | (in[1] >> 4))];
    out[2] = (len > 1) ?
             cb64[(int) (((in[1] << 4) >> 2) | (in[2] >> 6))] :
             '=';
    out[3] = (len > 2) ?
             cb64[(int) ((in[2] << 2) >> 2)] :
             '=';

}

cb64 - это строка длиной 64, но индекс, сгенерированный с помощью битовых манипуляций, иногда выходит за пределы диапазона (от 0 до 63).

Почему !!!

1 Ответ

1 голос
/ 06 июня 2019

Разрешение к этому было для правильной обработки битов.

char 8 битов обрабатываются и затем приводятся к unsigned int, вводит в него 24 дополнительных бита, которые необходимо было установить на 0.

Итак, out[0] = cb64[(unsigned int) ((in[0] >> 2) & 0x003f)];
out[1] = cb64[(unsigned int) ((((in[0] << 6) >> 2) | (in[1] >> 4))) & 0x003f)]; .. и так далее обрабатывает маскирование

...