📄 untmain.cpp
字号:
//---------------------------------------------------------------------------
#include <string.h>
#include <vcl.h>
#pragma hdrstop
#include "untMain.h"
#include "untBeatCode.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//数据的X次方
__int64 DataXSquare(int iData, int X){ int i; __int64 iRet; if(X == 0) return 1; iRet = 1; for(i = 0; i < X; i++) { iRet = iRet * iData; } return iRet;}
//十进制数据转换成二进制数据(大于0)
//注意二进制的高位占据缓冲数据的高位int DecToBin(__int64 iData, int iIndex, int iLen, unsigned char *pBuff){ int iMod, iRet; iRet = iIndex + iLen; if(iData == 0) { pBuff[iIndex] = 0; iIndex++; } while(iData > 0) { iMod = iData % 2; iData = iData / 2; pBuff[iIndex] = iMod; iIndex++; } return iRet;}
//二进制数据转换成十进制数据
__int64 BinToDec(unsigned char *pBuff, int iStart, int iEnd){ int i; __int64 iData; iData = 0; for(i = iStart; i <= iEnd; i++) { if(pBuff[i] == 1) iData = iData + DataXSquare(2, i - iStart); } return iData;}
//设置加密的数据缓冲
void TfrmMain::SetDataBuff(unsigned char *DataBuff)
{
int iData, iIndex;
unsigned char Buff[64];
iIndex = 0;
memset(Buff, 0, 64);
//机器编号(0-14)
iData = StrToInt(edtMachCode->Text);
iIndex = DecToBin(iData, iIndex, 15, Buff);
//随机码(15-25)
iData = StrToInt(edtRandCode->Text);
iIndex = DecToBin(iData, iIndex, 11, Buff);
//是否允许调整参数
if(ckbUpdPar->Checked)
iData = 1;
else
iData = 0;
iIndex = DecToBin(iData, iIndex, 1, Buff);
//多少次游戏调节检测(27-28)
iData = cmbDayPlay->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//赢分最大误差(29-30)
iData = cmbMinError->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//押分超过多少为杀板人(31-32)
iData = cmbGreatePress->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//押分少于多少为钓鱼人(33-34)
iData = cmbFisherPress->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//钓鱼人最大赢分1(35-37)
iData = cmbFisherMaxWin1->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//钓鱼人最大赢分2(38-40)
iData = cmbFisherMaxWin2->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//拉连线彩下限(41-43)
iData = cmbSendLineLottMin->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//拉连线彩上限(44-46)
iData = cmbSendLineLottMax->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//拉单机彩输分(47-49)
iData = cmbPullMachKill->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//杀板人多少次游戏后必须考虑放单机彩(50-52)
iData = PullMachPlay1->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//其他人多少次游戏后必须考虑放单机彩(53-55)
iData = PullMachPlay2->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//杀板人输分多少后考虑放分给他(56-57)
iData = cmbSendPoint1->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//其他人输分多少后考虑放分给他(58-59)
iData = cmbSendPoint2->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//输分超过多少称为大杀板人(60-61)
iData = cmbRescueKill->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//大杀板人押分超过多少放分(62-63)
iData = cmbRescuePoint->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//设置DataBuff
DataBuff[0] = BinToDec(Buff, 0, 7);
DataBuff[1] = BinToDec(Buff, 8, 15);
DataBuff[2] = BinToDec(Buff, 16, 23);
DataBuff[3] = BinToDec(Buff, 24, 31);
DataBuff[4] = BinToDec(Buff, 32, 39);
DataBuff[5] = BinToDec(Buff, 40, 47);
DataBuff[6] = BinToDec(Buff, 48, 55);
DataBuff[7] = BinToDec(Buff, 56, 63);
}
//在字符串strCode1前面补0
AnsiString FillZero(AnsiString strCode, int iNeedLen)
{
int i, iLen;
AnsiString strZero;
iLen = strCode.Length();
if(iLen >= iNeedLen)
{
return strCode;
}
else
{
strZero = "";
for(i = 0; i < iNeedLen - iLen; i++)
{
strZero = strZero + '0';
}
return strZero + strCode;
}
}
//打码
bool TfrmMain::BeatCode(unsigned char *pIn, unsigned char *pOut){ int i, iData; unsigned char Buff[8]; //将整数转换成二进制数据 for(i = 0; i < 8; i++) { memset(Buff, 0, 8); DecToBin(pIn[i], 0, 8, Buff); memcpy(pOut + 8 * i, Buff, 8); } //0 - 14位:机器编号(验证) iData = BinToDec(pOut, 0, 14); if(iData != StrToInt(edtMachCode->Text)) return FALSE; //15 - 25位:随机码(验证) iData = BinToDec(pOut, 15, 25); if(iData != StrToInt(edtRandCode->Text)) return FALSE; //是否允许用户调整游戏参数 iData = BinToDec(pOut, 26, 26); if(iData == 0) ckbUpdPar->Checked = false; else ckbUpdPar->Checked = true; //27 - 28位:多少次游戏调节检测 iData = BinToDec(pOut, 27, 28); cmbDayPlay->ItemIndex = iData; //29 - 30位:实际和理想分数最小误差 iData = BinToDec(pOut, 29, 30); cmbMinError->ItemIndex = iData; //31 - 32位:押分达多少称为杀板人 iData = BinToDec(pOut, 31, 32); cmbGreatePress->ItemIndex = iData; //33 - 34位:押分少于多少称钓鱼人 iData = BinToDec(pOut, 33, 34); cmbFisherPress->ItemIndex = iData; //35 - 37位:钓鱼人的最大赢分1 iData = BinToDec(pOut, 35, 37); cmbFisherMaxWin1->ItemIndex = iData; //38 - 40位:钓鱼人的最大赢分2 iData = BinToDec(pOut, 38, 40); cmbFisherMaxWin2->ItemIndex = iData; //41 - 43位:连线彩达多少才能拉下限 iData = BinToDec(pOut, 41, 43); cmbSendLineLottMin->ItemIndex = iData; //44 - 46位:连线彩达多少才能拉上限 iData = BinToDec(pOut, 44, 46); cmbSendLineLottMax->ItemIndex = iData; //47 - 49位:拉单机彩最小输分 iData = BinToDec(pOut, 47, 49); cmbPullMachKill->ItemIndex = iData; //50 - 52位:杀板人多少次游戏后必须考虑单机彩1 iData = BinToDec(pOut, 50, 52); PullMachPlay1->ItemIndex = iData; //53 - 55位:其他人多少次游戏后必须考虑单机彩2 iData = BinToDec(pOut, 53, 55); PullMachPlay2->ItemIndex = iData; //56 - 57位:杀板人输分达多少考虑放用户 iData = BinToDec(pOut, 56, 57); cmbSendPoint1->ItemIndex = iData; //58 - 59位:其他人输分达多少考虑放用户 iData = BinToDec(pOut, 58, 59); cmbSendPoint2->ItemIndex = iData; //60 - 6位:用户输分超过多少称大杀板人 iData = BinToDec(pOut, 60, 61); cmbRescueKill->ItemIndex = iData; //62 - 63位:大杀板人单次押分多少才拯救 iData = BinToDec(pOut, 62, 63); cmbRescuePoint->ItemIndex = iData; return TRUE;}
//---------------------------------------------------------------------------
__fastcall TfrmMain::TfrmMain(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnEncClick(TObject *Sender)
{
unsigned char In[8];
unsigned char Out[8];
unsigned char Buff[8];
unsigned char CodeBuff[64];
int i, iTemp, iCode1, iCode2, iCode3, iCode4;
AnsiString strCode1, strCode2, strCode3, strCode4;
//判断机器编号输入是否正确
iTemp = StrToInt(edtMachCode->Text);
if(iTemp < 0 || iTemp > 32000)
{
Application->MessageBoxA("机器编号输入错误,请输入0-32000之间的数据!", "输入错误", MB_OK);
edtMachCode->SetFocus();
return;
}
//判断随机码输入是否正确
iTemp = StrToInt(edtRandCode->Text);
if(iTemp < 0 || iTemp > 4000)
{
Application->MessageBoxA("随机码输入错误,请输入0-4000之间的数据!", "输入错误", MB_OK);
edtRandCode->SetFocus();
return;
}
//设置加密的数据缓冲
SetDataBuff(In);
//加密数据
Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), ENCRYPT);
//将加密后的数据转换成用十进制表示
memset(CodeBuff, 0, 64);
for(i = 0; i < 8; i++)
{ memset(Buff, 0, 8); DecToBin(Out[i], 0, 8, Buff); memcpy(CodeBuff + 8 * i, Buff, 8); } //48 - 63位 iCode1 = BinToDec(CodeBuff, 48, 63);
strCode1 = FillZero(IntToStr(iCode1), 5);
//32 - 47位 iCode2 = BinToDec(CodeBuff, 32, 47);
strCode2 = FillZero(IntToStr(iCode2), 5);
//16 - 31位 iCode3 = BinToDec(CodeBuff, 16, 31);
strCode3 = FillZero(IntToStr(iCode3), 5);
//0 - 15位 iCode4 = BinToDec(CodeBuff, 0, 15);
strCode4 = FillZero(IntToStr(iCode4), 5);
edtCode->Text = strCode1 + strCode2 + strCode3 + strCode4;}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnDecClick(TObject *Sender)
{
int iIndex;
unsigned char In[8];
unsigned char Out[8];
unsigned char Buff[64];
//将整数转换成二进制数据放在Buff中
iIndex = 0;
memset(Buff, 0, 64);
//0 - 15位
iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(16, 5)), iIndex, 16, Buff);
//16 - 31位
iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(11, 5)), iIndex, 16, Buff);
//32 - 47位
iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(6, 5)), iIndex, 16, Buff);
//48 - 63位
iIndex = DecToBin(StrToInt64(edtCode->Text.SubString(1, 5)), iIndex, 16, Buff);
//设置输入缓冲
In[0] = BinToDec(Buff, 0, 7);
In[1] = BinToDec(Buff, 8, 15);
In[2] = BinToDec(Buff, 16, 23);
In[3] = BinToDec(Buff, 24, 31);
In[4] = BinToDec(Buff, 32, 39);
In[5] = BinToDec(Buff, 40, 47);
In[6] = BinToDec(Buff, 48, 55);
In[7] = BinToDec(Buff, 56, 63);
//解密数据
Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), DECRYPT);
//分析解密数据
memset(Buff, 0, 64);
if(!BeatCode(Out, Buff))
{
Application->MessageBoxA("您输入的卡号不正确!", "输入错误", MB_OK);
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -