Не знаю, как прикрепить код CRC к моей программе - PullRequest
0 голосов
/ 13 января 2019

Я пишу программу, в которой мне нужно прочитать файл, а затем разделить его на меньшие. После этого я должен объединить их в один файл, который должен быть таким, как этот, перед делением. Я должен проверить оба файла с помощью CRC. У меня уже есть код CRC, но я не знаю, как прикрепить его к моей программе. Я не знаю, какие аргументы я должен отправить * данные и размер. Большое спасибо за помощь.

#define CRC16 0x8005

uint16_t gen_crc16(const uint8_t *data, uint16_t size)
{
    uint16_t out = 0;
    int bits_read = 0, bit_flag;

    if(data == NULL)
        return 0;

    while(size > 0)
    {
        bit_flag = out >> 15;

        out <<= 1; 
        out |= (*data >> bits_read) & 1; 

        bits_read++;
        if(bits_read > 7)
        {
            bits_read = 0;
            data++;
            size--;
        }

        if(bit_flag)
            out ^= CRC16;
    }

    int i;
    for (i = 0; i < 16; ++i) {
        bit_flag = out >> 15;
        out <<= 1;
        if(bit_flag)
            out ^= CRC16;
    }

    uint16_t crc = 0;
    i = 0x8000;
    int j = 0x0001;
    for (; i != 0; i >>=1, j <<= 1) {
        if (i & out) crc |= j;
    }

    return crc;
}

А вот код моей программы:

#include <iostream>
#include <cstdlib>
#include <cstring>
#include <fstream>
#include <string>

using namespace std;

void podzial_pliku(string rozmiar, string nazwa_pliku);
void scalanie_plikow(string nazwa_pliku);


int main(int argc, char* argv[])
{
    if(string(argv[1])=="p")
        podzial_pliku(argv[2],argv[3]);
    if (string(argv[1])=="s")
        scalanie_plikow(argv[2]);

    system ("pause");
    return 0;
}


void podzial_pliku(string rozmiar, string nazwa_pliku)
{
    char bufor[1024];
    fstream plik_do_podzialu;
    plik_do_podzialu.open(nazwa_pliku.c_str(),ios::in);

    if (!plik_do_podzialu.is_open())
    cerr << "Nieudane 1 otwarcie pliku " << nazwa_pliku << " do odczytu." <<         endl;

    plik_do_podzialu.seekg(0,ios::end);
    int rozmiar_pliku = plik_do_podzialu.tellg();
    plik_do_podzialu.seekg(0,ios::beg);

    int ile; 
    int rozm = atoi (rozmiar.c_str()); 
    ile = rozmiar_pliku / rozm;


    int rozmiar_ostatniego_pliku;
    if (rozmiar_pliku % rozm != 0)
    {
        rozmiar_ostatniego_pliku = rozmiar_pliku % rozm;
        ile += 1; 
    }


string numer[4];
string nazwa_nowego_pliku[200];
for (int i=0;i<ile;i++)
   {
    numer[2]=i%10+'0'; 
    if (i>=10)         
        numer[1]=(i/10)%10+'0';
    else numer[1]='0';
    if (i<100)        
        numer[0]='0';
    else numer[0]=(i/100)%10+'0';

    string nazwa = "";
    int p = 0;
        while (nazwa_pliku[p] != '.') 
        {
        nazwa += nazwa_pliku[p];
        p++;
        }
    nazwa_nowego_pliku[i] = nazwa + numer[0] + numer[1] + numer[2] + ".dat";
   }

int i=0;
while (i<ile)
    {
    plik_do_podzialu.read(bufor,rozm);
    fstream podzielone_pliki;
    podzielone_pliki.open(nazwa_nowego_pliku[i].c_str(),ios::out);
    if (!podzielone_pliki.is_open()) 
    cerr << "Nieudane otwarcie pliku " << nazwa_nowego_pliku[i] << " do odczytu." << endl;
    podzielone_pliki << rozmiar_pliku << " " << ile << " " << nazwa_nowego_pliku[i+1] << "\r\n" << endl; 
    podzielone_pliki.write(bufor, rozm); 
     podzielone_pliki.close();
    i++;
    }

fstream podzielone_pliki;
podzielone_pliki.open(nazwa_nowego_pliku[ile-1].c_str(),ios::out);
plik_do_podzialu.read(bufor,rozmiar_ostatniego_pliku);
if (!podzielone_pliki.is_open())
    cerr << "Nieudane otwarcie pliku " << podzielone_pliki << " do odczytu." << endl;
podzielone_pliki << rozmiar_pliku << " " << ile << "\r\n" << endl;
podzielone_pliki.write(bufor, rozmiar_ostatniego_pliku);

plik_do_podzialu.close();
}

void scalanie_plikow(string nazwa_pliku)
{
int rozmiar, ile;
string nastepny_program;

fstream pierwszy_plik_do_scalenia;
pierwszy_plik_do_scalenia.open(nazwa_pliku.c_str(), ios::in); 
if (!pierwszy_plik_do_scalenia.is_open())
    cerr << "Nieudane otwarcie pliku " << nazwa_pliku << " do odczytu." << endl;

pierwszy_plik_do_scalenia >> rozmiar >> ile >> nastepny_program; 
fstream scalony_plik;
scalony_plik.open("scalony_plik.dat", ios::out|ios::app);
    if(!scalony_plik.is_open()) 
        cerr << "Nieudane otwarcie pliku scalony_plik.dat do odczytu" << endl;
string linia;
getline(pierwszy_plik_do_scalenia,linia);
while(!pierwszy_plik_do_scalenia.eof())
    {
        getline(pierwszy_plik_do_scalenia,linia);
        scalony_plik << linia;
    }

pierwszy_plik_do_scalenia.close();
for (int i=1;i<(ile-1);i++)
{
    int rozmiar, ile2;
    fstream kolejny_plik_do_scalenia;
    kolejny_plik_do_scalenia.open(nastepny_program.c_str(), ios::in);
    if (!kolejny_plik_do_scalenia.is_open())
        cerr << "Nieudane otwarcie pliku " << nastepny_program << " do odczytu." << endl;

    kolejny_plik_do_scalenia >> rozmiar >> ile2 >> nastepny_program;

    string linia;
    while (!kolejny_plik_do_scalenia.eof())
    {
        getline(kolejny_plik_do_scalenia,linia);
        scalony_plik << linia;
    }
    kolejny_plik_do_scalenia.close();
}
fstream kolejny_plik_do_scalenia;
kolejny_plik_do_scalenia.open(nastepny_program.c_str(), ios::in);
if (!kolejny_plik_do_scalenia.is_open())
    cerr << "Nieudane otwarcie pliku " << nastepny_program << " do odczytu." << endl;

kolejny_plik_do_scalenia >> rozmiar >> ile;

while (!kolejny_plik_do_scalenia.eof())
{
    getline(kolejny_plik_do_scalenia,linia);
    scalony_plik << linia;
}
kolejny_plik_do_scalenia.close();

scalony_plik.close();

}

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вам нужно изменить функцию crc, чтобы в качестве входной информации взять crc.

#define CRC16 0x8005

uint16_t gen_crc16(uint16_t crc, const uint8_t *data, uint16_t size)
{
    int bit_flag, i;

    if(data == NULL)
        return crc;

    while(size-- > 0)
    {
        crc ^= ((uint16_t)(*data)) << 8;    // xor in next byte
        for(i = 0; i < 8; i++){             // cycle crc for 8 bits
            bit_flag = crc >> 15;
            crc << = 1;
            if(bit_flag)
                crc ^= CRC16;
        }
    }
    return crc;
}

Основной код будет выглядеть так:

uint16_t crc = 0;
// ...
// loop
//  read a chunk of the file
    crc = crc16(crc, bufor, size);
// ...
0 голосов
/ 13 января 2019

Похоже, что вы должны передать своей реализации CRC указатель на буфер данных. Если у вас достаточно памяти, а данные достаточно малы, загрузите в буфер все содержимое файла, а затем передайте в функцию CRC указатель буфера и его длину. Это много, что я не использую C, но ...

uint8_t *data = NULL;
uint8_t *dataOffset = NULL;
uint16_t fileLength = 0;
uint16_t fileCRC = 0;
size_t readBytes = 0;
FILE *fp = NULL;

fp = fopen("temp.dat", "rb");
fseek(fp, 0L, SEEK_END);
fileLength = ftell(fp);
rewind(fp);
data = (uint8_t *) malloc(sizeof(uint8_t) * fileLength);
dataOffset = data;
while((readBytes = fread(dataOffset, sizeof(uint8_t), 1024, fp)) > 0)
{
    dataOffset += readBytes;
} 
fclose(fp);
fileCRC = gen_crc16(data, fileLength);

// Now you can check if the new CRC is the same as the old one.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...