Как мне прочитать двоичные данные, преобразовать их в int, а затем преобразовать обратно в C++?

Я пытаюсь открыть файл wav, прочитать его, преобразовать буфер в массив целых чисел, затем преобразовать его обратно и записать его.

int main(){

    ifstream file ("C:\\Documents\\ParadigmE3-shortened.wav",std::ios_base::out | std::ios_base::binary);

    char * header = new char[50000044];
    file.read(header, 50000044);

    cout << header[0] << endl;

    unsigned int * header_int = new unsigned int[50000044];

    for(unsigned int i = 0; i < sizeof(header); i++){
        header_int[i] = header[i];
    }



    char * writefile = new char[50000044];

    for(unsigned int i = 0; i < sizeof(header); i++){
        itoa(header_int[i], &writefile[i], 10);
    }


    cout << writefile[0] << endl;
    ofstream newfile ("C:\\Documents\\ParadigmE3-modified.wav", std::ios_base::out | std::ios_base::binary);



    newfile.write(writefile, 50000044);

}

В настоящее время это печатает:

R
8

Указывая, что он изменил данные в процессе их преобразования. Как мне заставить это работать должным образом?


После некоторых предложений и обучения я могу выполнить расчеты char переменных, я переформулировал код, и теперь это:

int main(){

    // Create file variable with file
    ifstream file ("C:\\Documents\\ParadigmE3-shortened.wav",std::ios_base::out | std::ios_base::binary);

    // Read the first 15040512 bytes to char array pointer, called header
    char * header = new char[15040512];
    file.read(header, 15040512);

    // Copy contents of header to writefile, after the 44'th byte, multiply the value by 2
    char * writefile = new char[15040512];
    for(int i = 0; i < sizeof(header); i++){
        if(i<44) writefile[i] = header[i];
        if(i>=44) writefile[i] = 2 * header[i];
    }

    // Copy the contents of writefile, but at the 44th byte, divide it by 2, returning it to its original value
    for(int i = 0; i < sizeof(header); i++){
        if(i<44) writefile[i] = writefile[i];
        if(i>=44) writefile[i] = .5 * writefile[i];
    }

    // Create file to write to
    ofstream newfile ("C:\\Documents\\ParadigmE3-modified.wav", std::ios_base::out | std::ios_base::binary);

    // Write writefile to file
    newfile.write(writefile, 15040512);

}

Однако при воспроизведении (в проигрывателе Windows Media) он не воспроизводится, поэтому, как я и предполагал, это явно не оригинальный файл.

1 ответ

Я понял. Пара вещей, которые я узнал, были то, что вы можете выполнять вычисления на 8-битной char переменные (с максимальным значением 255 без знака), поэтому мне не нужно было менять его на int массив, однако, я сделал, потому что он дал мне больше возможностей для работы (не беспокоясь об обрезании значений в 255).

Я включил всю программу (со списком заголовков включения), так как я также думаю, что это общий вопрос, и это, безусловно, самый простой способ, который я видел (другие способы, которые я не мог понять -- они были намного сложнее, чем делать то же самое).

Он читает файл wav, затем выполняет операцию с частью данных (начиная с 45-го байта), затем выполняет обратную операцию и записывает файл, который является копией оригинала.

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <fstream>
#include <string>
#include <bitset>
#include <string.h>

using namespace std;

int main(){


    ifstream file ("C:\\Documents\\ParadigmE3-shortened.wav",std::ios_base::out | std::ios_base::binary);

    char * header = new char[15040512];
    file.read(header, 15040512);


    int * writefile = new int[15040512];
    for(int i = 0; i < 15040512; i++){
        if(i<44) writefile[i] = header[i];
        if(i>=44) writefile[i] = 2 * header[i];
    }

    for(int i = 0; i < 15040512; i++){
        if(i<44) header[i] = writefile[i];
        if(i>=44) header[i] = .5 * writefile[i];
    }

    ofstream newfile ("C:\\Documents\\ParadigmE3-modified.wav", std::ios_base::out | std::ios_base::binary);


    newfile.write(header, 15040512);

}
Другие вопросы по тегам