不知道如何将CRC代码附加到我的程序中
Don't know how to attach a CRC code to my programme
我正在编写一个程序,我必须读取一个文件,然后将其分成较小的文件。之后,我必须将它们合并到一个文件中,在划分之前必须像这个文件一样。我必须用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] << "rn" << 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 << "rn" << 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();
}
似乎您必须向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 指针可能会超出范围,因此必须首先验证正确的指针偏移量。
您需要修改 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);
// ...
相关文章:
- 当我在main中声明了我的2d数组时,为什么我的程序会退出
- 为什么我的程序在for循环中k=0时返回垃圾值
- 为什么它只打印双链接列表的第一个值,而我的程序却崩溃了
- 我的程序没有从文件中读取并输入数据
- 为什么我的C++程序的程序集输出充满了 .ascii,没有汇编代码?
- 我的程序有一个保存配置文件的GUI,如何双击此配置文件以直接加载带有配置数据的GUI?
- 为什么我的程序不能显示斐波那契级数?
- 为什么我的程序在使用预留后没有加速?
- 为什么如果我添加这一行,我的程序会不断询问值
- 为什么当我输入较大的数字时,我的程序会到达文件末尾?
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- 为什么我的程序在 O0 和 O2 的优化级别返回不同的结果
- 为什么我的 c++ 程序检查不是初始化的变量?
- 为什么我的程序在输入某个形状的面积的测量值后没有结束?
- 在 fork() 之后,我在我的程序中不断得到相同的 pid
- C++ - 为什么我的程序在再次调用函数后关闭?
- 我的程序将 26 个字母转换为 ascII 没有显示正确答案
- 为什么我的程序在读取/写入文件时会删除最重要的数字?
- 我需要如何更改我的程序以使用打开/关闭原则?
- 我的 c++ 程序似乎没有发现字符串和我拥有但输入使用 getline 的变量之间的比较