Files
CodeRepository/SoftwareBusinessLines/Tools/CRC-32/mainwindow.cpp
chenzhen 222dda1e43 1,新增“App_ThermalImageSystem”;
2,新增“Apps”;
3,新增“Common”;
4,新增“FileList”;
5,新增“MediaX”;
6,新增“OpenSource”;
7,新增“Samples”;
8,新增“SoftwareBusinessLines”.
2026-02-14 23:03:23 +08:00

421 lines
13 KiB
C++
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "QThread"
#include <QFileDialog>
#include <QMessageBox>
#include <time.h>
#include <windows.h>
static const uint CRC32_Table[256] =
{
0x00000000, 0x77073096, 0xEE0E612C, 0x990951BA,
0x076DC419, 0x706AF48F, 0xE963A535, 0x9E6495A3,
0x0EDB8832, 0x79DCB8A4, 0xE0D5E91E, 0x97D2D988,
0x09B64C2B, 0x7EB17CBD, 0xE7B82D07, 0x90BF1D91,
0x1DB71064, 0x6AB020F2, 0xF3B97148, 0x84BE41DE,
0x1ADAD47D, 0x6DDDE4EB, 0xF4D4B551, 0x83D385C7,
0x136C9856, 0x646BA8C0, 0xFD62F97A, 0x8A65C9EC,
0x14015C4F, 0x63066CD9, 0xFA0F3D63, 0x8D080DF5,
0x3B6E20C8, 0x4C69105E, 0xD56041E4, 0xA2677172,
0x3C03E4D1, 0x4B04D447, 0xD20D85FD, 0xA50AB56B,
0x35B5A8FA, 0x42B2986C, 0xDBBBC9D6, 0xACBCF940,
0x32D86CE3, 0x45DF5C75, 0xDCD60DCF, 0xABD13D59,
0x26D930AC, 0x51DE003A, 0xC8D75180, 0xBFD06116,
0x21B4F4B5, 0x56B3C423, 0xCFBA9599, 0xB8BDA50F,
0x2802B89E, 0x5F058808, 0xC60CD9B2, 0xB10BE924,
0x2F6F7C87, 0x58684C11, 0xC1611DAB, 0xB6662D3D,
0x76DC4190, 0x01DB7106, 0x98D220BC, 0xEFD5102A,
0x71B18589, 0x06B6B51F, 0x9FBFE4A5, 0xE8B8D433,
0x7807C9A2, 0x0F00F934, 0x9609A88E, 0xE10E9818,
0x7F6A0DBB, 0x086D3D2D, 0x91646C97, 0xE6635C01,
0x6B6B51F4, 0x1C6C6162, 0x856530D8, 0xF262004E,
0x6C0695ED, 0x1B01A57B, 0x8208F4C1, 0xF50FC457,
0x65B0D9C6, 0x12B7E950, 0x8BBEB8EA, 0xFCB9887C,
0x62DD1DDF, 0x15DA2D49, 0x8CD37CF3, 0xFBD44C65,
0x4DB26158, 0x3AB551CE, 0xA3BC0074, 0xD4BB30E2,
0x4ADFA541, 0x3DD895D7, 0xA4D1C46D, 0xD3D6F4FB,
0x4369E96A, 0x346ED9FC, 0xAD678846, 0xDA60B8D0,
0x44042D73, 0x33031DE5, 0xAA0A4C5F, 0xDD0D7CC9,
0x5005713C, 0x270241AA, 0xBE0B1010, 0xC90C2086,
0x5768B525, 0x206F85B3, 0xB966D409, 0xCE61E49F,
0x5EDEF90E, 0x29D9C998, 0xB0D09822, 0xC7D7A8B4,
0x59B33D17, 0x2EB40D81, 0xB7BD5C3B, 0xC0BA6CAD,
0xEDB88320, 0x9ABFB3B6, 0x03B6E20C, 0x74B1D29A,
0xEAD54739, 0x9DD277AF, 0x04DB2615, 0x73DC1683,
0xE3630B12, 0x94643B84, 0x0D6D6A3E, 0x7A6A5AA8,
0xE40ECF0B, 0x9309FF9D, 0x0A00AE27, 0x7D079EB1,
0xF00F9344, 0x8708A3D2, 0x1E01F268, 0x6906C2FE,
0xF762575D, 0x806567CB, 0x196C3671, 0x6E6B06E7,
0xFED41B76, 0x89D32BE0, 0x10DA7A5A, 0x67DD4ACC,
0xF9B9DF6F, 0x8EBEEFF9, 0x17B7BE43, 0x60B08ED5,
0xD6D6A3E8, 0xA1D1937E, 0x38D8C2C4, 0x4FDFF252,
0xD1BB67F1, 0xA6BC5767, 0x3FB506DD, 0x48B2364B,
0xD80D2BDA, 0xAF0A1B4C, 0x36034AF6, 0x41047A60,
0xDF60EFC3, 0xA867DF55, 0x316E8EEF, 0x4669BE79,
0xCB61B38C, 0xBC66831A, 0x256FD2A0, 0x5268E236,
0xCC0C7795, 0xBB0B4703, 0x220216B9, 0x5505262F,
0xC5BA3BBE, 0xB2BD0B28, 0x2BB45A92, 0x5CB36A04,
0xC2D7FFA7, 0xB5D0CF31, 0x2CD99E8B, 0x5BDEAE1D,
0x9B64C2B0, 0xEC63F226, 0x756AA39C, 0x026D930A,
0x9C0906A9, 0xEB0E363F, 0x72076785, 0x05005713,
0x95BF4A82, 0xE2B87A14, 0x7BB12BAE, 0x0CB61B38,
0x92D28E9B, 0xE5D5BE0D, 0x7CDCEFB7, 0x0BDBDF21,
0x86D3D2D4, 0xF1D4E242, 0x68DDB3F8, 0x1FDA836E,
0x81BE16CD, 0xF6B9265B, 0x6FB077E1, 0x18B74777,
0x88085AE6, 0xFF0F6A70, 0x66063BCA, 0x11010B5C,
0x8F659EFF, 0xF862AE69, 0x616BFFD3, 0x166CCF45,
0xA00AE278, 0xD70DD2EE, 0x4E048354, 0x3903B3C2,
0xA7672661, 0xD06016F7, 0x4969474D, 0x3E6E77DB,
0xAED16A4A, 0xD9D65ADC, 0x40DF0B66, 0x37D83BF0,
0xA9BCAE53, 0xDEBB9EC5, 0x47B2CF7F, 0x30B5FFE9,
0xBDBDF21C, 0xCABAC28A, 0x53B39330, 0x24B4A3A6,
0xBAD03605, 0xCDD70693, 0x54DE5729, 0x23D967BF,
0xB3667A2E, 0xC4614AB8, 0x5D681B02, 0x2A6F2B94,
0xB40BBE37, 0xC30C8EA1, 0x5A05DF1B, 0x2D02EF8D
};
MainWindow::MainWindow(QWidget* parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->groupBoxTest->setVisible(false);
this->resize(600, 226);
m_bRun = false;
m_bRun3 = false;
m_bValue = false;
m_lTemp = 0;
m_uiPara = 0;
m_pcDataBuff = NULL;
ui->pushButtonUpdate->setEnabled(false);
ui->lineEditDay->setPlaceholderText("2023-01-01");
ui->lineEditDay->setInputMask("0000-00-00");
ui->lineEditTime->setInputMask("00:00:00");
QRegExp regx("[a-zA-Z0-9]+$");
QValidator* validator = new QRegExpValidator(regx, ui->lineEditCRC);
ui->lineEditCRC->setValidator(validator);
//在线程中启动设备
m_bThreadRunning = true;
m_futureThreadRun_StartDevice = QtConcurrent::run(
&m_varThreadPool_StartDevice,
&MainWindow::ThreadEntry,
(void*)this,
&MainWindow::ThreadFunStartParse);
QTimer* timer = new QTimer(this);
connect(timer, SIGNAL(timeout()), this, SLOT(timerUpdate()));
timer->start(40);
}
MainWindow::~MainWindow()
{
if (m_bThreadRunning)
{
m_bThreadRunning = false;
m_futureThreadRun_StartDevice.waitForFinished();
}
delete ui;
}
unsigned int MainWindow::calculate_CRC32(void* pStart, unsigned int uSize, unsigned int iCrc)
{
#define INIT 0xffffffff
#define XOROT 0xffffffff
uint uCRCValue;
uchar* pData;
/* init the start value */
uCRCValue = iCrc;
pData = (uchar*)pStart;
/* calculate CRC */
while (uSize --)
{
uchar uc = *pData++;
uchar ut = (uCRCValue ^ uc) & 0xFF;
uCRCValue = CRC32_Table[ut] ^ (uCRCValue >> 8);
}
/* XOR the output value */
return uCRCValue/* ^ XOROT*/;
}
void MainWindow::on_pushButtonCal_clicked()
{
int iNum = ui->lineEditNum->text().toInt();
QByteArray ba0 = ui->lineEditCurData->text().toLatin1();
uint pStart = HexToDec(ba0.data());
QByteArray ba = ui->lineEditCurCrc->text().toLatin1();
uint iCrc = HexToDec(ba.data());
unsigned int iTemp = calculate_CRC32((void*)&pStart, iNum, iCrc);
ui->labelCrcValue->setText(QString::number(iTemp, 16));
}
int MainWindow::HexToDec(char* src)
{
//将src中的无符号十六进制字符串转为十进制数
//如src="001A"则返回26
//字符串src需要以'\0'作为结束标志
int value = 0;
int srclen = strlen(src);
int i;
for (i = 0; i < srclen; i++)
{
if (src[i] <= '9' && src[i] >= '0')
{
value = value * 16 + (int)(src[i] - '0'); //'0'
}
else if (src[i] <= 'f' && src[i] >= 'a')
{
value = value * 16 + (int)(src[i] - 'a' + 10);
}
else
{
value = value * 16 + (int)(src[i] - 'A' + 10);
}
}
return value;//返回转换后的数值
}
void MainWindow::on_pushButtonCal2_clicked()
{
QByteArray ba = ui->lineEditCurCrc2->text().toLatin1();
uint iCurCrc = HexToDec(ba.data());
QByteArray ba2 = ui->lineEditCurData2->text().toLatin1();
m_iValueCrc = HexToDec(ba2.data());
m_uCRCValue = iCurCrc;
m_lTemp = 0;
m_bRun = true;
}
void MainWindow::ThreadEntry(void* pOwner, ThreadRunFunPtr pRunFun)
{
MainWindow* pRunClass = reinterpret_cast<MainWindow*>(pOwner);
if (nullptr == pRunClass)
{
return;
}
(pRunClass->*pRunFun)();
}
void MainWindow::ThreadFunStartParse()
{
while (m_bThreadRunning)
{
if (m_bRun)
{
uchar ut = (m_uCRCValue ^ 0) & 0xFF;
m_uCRCValue = CRC32_Table[ut] ^ (m_uCRCValue >> 8);
m_lTemp++;
if (m_uCRCValue == m_iValueCrc)
{
m_bRun = false;
}
}
else if (m_bRun3)
{
m_uiPara = 0;
uint uCRCValue = m_uCRCValue;
while (uCRCValue != m_iValueCrc)
{
uCRCValue = m_uCRCValue;
m_uiPara++;
m_lTemp++;
for (int i = 0; i < 4; i++)
{
uchar ut = (uCRCValue ^ (m_uiPara >> (i * 8))) & 0xFF;
uCRCValue = CRC32_Table[ut] ^ (uCRCValue >> 8);
if (uCRCValue == m_iValueCrc)
{
m_bValue = true;
m_bRun3 = false;
break;
}
}
}
}
else
{
QThread::msleep(1);
}
}
}
void MainWindow::timerUpdate()
{
ui->labelCrcValue2->setText(QString::number(m_lTemp));
ui->lineEditCurCrc3->setText(QString::number(m_uiPara));
ui->lineEditCurCrc4->setText(QString::number(m_uiPara));
if (m_bValue)
{
m_bValue = false;
memcpy(m_pcDataBuff + m_lFileSize - sizeof(int), &m_uiPara, sizeof(int));
QFile file(m_strFileName);
if (file.open(QIODevice::WriteOnly))
{
SYSTEMTIME st;
GetSystemTime(&st);
int iYear = st.wYear;
int iMonth = st.wMonth;
int iDay = st.wDay;
int iHour = st.wHour;
int iMinute = st.wMinute;
int iSecond = st.wSecond;
QString strDay = ui->lineEditDay->text();
QString strTime = ui->lineEditTime->text();
bool bModify = false;
if (strDay != "" && strTime != "")
{
QStringList listStr = strDay.split("-");
st.wYear = QString(listStr.at(0)).toInt();
st.wMonth = QString(listStr.at(1)).toInt();
st.wDay = QString(listStr.at(2)).toInt();
listStr = strTime.split(":");
st.wHour = (QString(listStr.at(0)).toInt() - 8) % 24;
st.wMinute = QString(listStr.at(1)).toInt();
st.wSecond = QString(listStr.at(2)).toInt();
SetSystemTime(&st);
bModify = true;
}
file.write(m_pcDataBuff, m_lFileSize);
file.close();
ui->pushButtonUpdate->setEnabled(true);
if (bModify)
{
st.wYear = iYear;
st.wMonth = iMonth;
st.wDay = iDay;
st.wHour = iHour;
st.wMinute = iMinute;
st.wSecond = iSecond;
SetSystemTime(&st);
}
}
}
}
void MainWindow::on_pushButtonCal3_clicked()
{
QByteArray ba = ui->lineEditCurCrc2->text().toLatin1();
m_uCRCValue = HexToDec(ba.data());
m_uCRCValue ^= 0XFFFFFFFF;
QByteArray ba2 = ui->lineEditCurData2->text().toLatin1();
m_iValueCrc = HexToDec(ba2.data());
m_iValueCrc ^= 0XFFFFFFFF;
m_lTemp = 0;
m_bRun3 = true;
}
void MainWindow::on_pushButtonUse_clicked()
{
QString str = ui->labelCrcValue->text();
ui->lineEditCurCrc->setText(str);
}
void MainWindow::on_pushButtonOpen_clicked()
{
QString fileName = QFileDialog::getOpenFileName(this, tr("打开文件"), "./", tr("Rar(*.rar);;ZIP(*.zip);;All(*.*)"));
ui->labelFileName->setText(fileName);
QFile file(fileName);
if (!file.open(QIODevice::ReadOnly))
{
return;
}
m_arrayFile = file.readAll();
m_ulFileSize = file.size();
file.close();
ui->labelSize->setText(QString::number(m_ulFileSize));
unsigned int uiTemp = calculate_CRC32((void*)m_arrayFile.data(), m_ulFileSize);
uiTemp ^= 0xffffffff;
ui->labelCRC32->setText(QString::number(uiTemp, 16));
ui->pushButtonUpdate->setEnabled(true);
}
void MainWindow::on_pushButtonUpdate_clicked()
{
QString strLen = ui->lineEditSize->text();
QString strCrc = ui->lineEditCRC->text();
if (strLen == "" || strCrc == "")
{
QMessageBox::critical(this, "警告", "更新文件大小和CRC值不能为空");
return;
}
m_lFileSize = ui->lineEditSize->text().toInt();
if (m_lFileSize < (m_ulFileSize + 12))
{
QMessageBox::critical(this, "警告", "更新文件大小必须比源文件大12个字节");
return;
}
m_strFileName = QFileDialog::getSaveFileName(this, tr("打开文件"), "", tr("Rar(*.rar);;Zip(*.zip);;All(*.*)"));
if (m_strFileName.isNull())
{
return;
}
if (m_pcDataBuff)
{
delete m_pcDataBuff;
}
m_pcDataBuff = new char[m_lFileSize];
memcpy(m_pcDataBuff, m_arrayFile.data(), m_ulFileSize);
ulong ulen = m_lFileSize - m_ulFileSize - 4;
char* cRand = new char[ulen];
for (int i = 0; i < ulen; i++)
{
cRand[i] = rand();
}
cRand[0] = 0x55;
cRand[1] = 0x55;
cRand[2] = 0x55;
cRand[3] = 0x55;
cRand[4] = 0xAA;
cRand[5] = 0xAA;
cRand[6] = 0xAA;
cRand[7] = 0xAA;
memcpy(m_pcDataBuff + m_ulFileSize, cRand, ulen);
QByteArray ba = QByteArray(m_pcDataBuff, m_lFileSize - 4);
m_uCRCValue = calculate_CRC32((void*)ba.data(), m_lFileSize - 4);
QByteArray ba2 = ui->lineEditCRC->text().toLatin1();
m_iValueCrc = HexToDec(ba2.data());
m_iValueCrc ^= 0XFFFFFFFF;
m_lTemp = 0;
m_bValue = false;
m_bRun3 = true;
ui->pushButtonUpdate->setEnabled(false);
}