?? untmain.cpp
字號(hào):
//---------------------------------------------------------------------------
#include <string.h>
#include <vcl.h>
#pragma hdrstop
#include "untMain.h"
#include "untBeatCode.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TfrmMain *frmMain;
//數(shù)據(jù)的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;}
//十進(jìn)制數(shù)據(jù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)(大于0)
//注意二進(jìn)制的高位占據(jù)緩沖數(shù)據(jù)的高位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;}
//二進(jìn)制數(shù)據(jù)轉(zhuǎn)換成十進(jìn)制數(shù)據(jù)
__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;}
//設(shè)置加密的數(shù)據(jù)緩沖
void TfrmMain::SetDataBuff(unsigned char *DataBuff)
{
int iData, iIndex;
unsigned char Buff[64];
iIndex = 0;
memset(Buff, 0, 64);
//機(jī)器編號(hào)(0-14)
iData = StrToInt(edtMachCode->Text);
iIndex = DecToBin(iData, iIndex, 15, Buff);
//隨機(jī)碼(15-25)
iData = StrToInt(edtRandCode->Text);
iIndex = DecToBin(iData, iIndex, 11, Buff);
//是否允許調(diào)整參數(shù)
if(ckbUpdPar->Checked)
iData = 1;
else
iData = 0;
iIndex = DecToBin(iData, iIndex, 1, Buff);
//多少次游戲調(diào)節(jié)檢測(cè)(27-28)
iData = cmbDayPlay->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//贏分最大誤差(29-30)
iData = cmbMinError->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//押分超過(guò)多少為殺板人(31-32)
iData = cmbGreatePress->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//押分少于多少為釣魚(yú)人(33-34)
iData = cmbFisherPress->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//釣魚(yú)人最大贏分1(35-37)
iData = cmbFisherMaxWin1->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//釣魚(yú)人最大贏分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);
//拉單機(jī)彩輸分(47-49)
iData = cmbPullMachKill->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//殺板人多少次游戲后必須考慮放單機(jī)彩(50-52)
iData = PullMachPlay1->ItemIndex;
iIndex = DecToBin(iData, iIndex, 3, Buff);
//其他人多少次游戲后必須考慮放單機(jī)彩(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);
//輸分超過(guò)多少稱為大殺板人(60-61)
iData = cmbRescueKill->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//大殺板人押分超過(guò)多少放分(62-63)
iData = cmbRescuePoint->ItemIndex;
iIndex = DecToBin(iData, iIndex, 2, Buff);
//設(shè)置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前面補(bǔ)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]; //將整數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù) for(i = 0; i < 8; i++) { memset(Buff, 0, 8); DecToBin(pIn[i], 0, 8, Buff); memcpy(pOut + 8 * i, Buff, 8); } //0 - 14位:機(jī)器編號(hào)(驗(yàn)證) iData = BinToDec(pOut, 0, 14); if(iData != StrToInt(edtMachCode->Text)) return FALSE; //15 - 25位:隨機(jī)碼(驗(yàn)證) iData = BinToDec(pOut, 15, 25); if(iData != StrToInt(edtRandCode->Text)) return FALSE; //是否允許用戶調(diào)整游戲參數(shù) iData = BinToDec(pOut, 26, 26); if(iData == 0) ckbUpdPar->Checked = false; else ckbUpdPar->Checked = true; //27 - 28位:多少次游戲調(diào)節(jié)檢測(cè) iData = BinToDec(pOut, 27, 28); cmbDayPlay->ItemIndex = iData; //29 - 30位:實(shí)際和理想分?jǐn)?shù)最小誤差 iData = BinToDec(pOut, 29, 30); cmbMinError->ItemIndex = iData; //31 - 32位:押分達(dá)多少稱為殺板人 iData = BinToDec(pOut, 31, 32); cmbGreatePress->ItemIndex = iData; //33 - 34位:押分少于多少稱釣魚(yú)人 iData = BinToDec(pOut, 33, 34); cmbFisherPress->ItemIndex = iData; //35 - 37位:釣魚(yú)人的最大贏分1 iData = BinToDec(pOut, 35, 37); cmbFisherMaxWin1->ItemIndex = iData; //38 - 40位:釣魚(yú)人的最大贏分2 iData = BinToDec(pOut, 38, 40); cmbFisherMaxWin2->ItemIndex = iData; //41 - 43位:連線彩達(dá)多少才能拉下限 iData = BinToDec(pOut, 41, 43); cmbSendLineLottMin->ItemIndex = iData; //44 - 46位:連線彩達(dá)多少才能拉上限 iData = BinToDec(pOut, 44, 46); cmbSendLineLottMax->ItemIndex = iData; //47 - 49位:拉單機(jī)彩最小輸分 iData = BinToDec(pOut, 47, 49); cmbPullMachKill->ItemIndex = iData; //50 - 52位:殺板人多少次游戲后必須考慮單機(jī)彩1 iData = BinToDec(pOut, 50, 52); PullMachPlay1->ItemIndex = iData; //53 - 55位:其他人多少次游戲后必須考慮單機(jī)彩2 iData = BinToDec(pOut, 53, 55); PullMachPlay2->ItemIndex = iData; //56 - 57位:殺板人輸分達(dá)多少考慮放用戶 iData = BinToDec(pOut, 56, 57); cmbSendPoint1->ItemIndex = iData; //58 - 59位:其他人輸分達(dá)多少考慮放用戶 iData = BinToDec(pOut, 58, 59); cmbSendPoint2->ItemIndex = iData; //60 - 6位:用戶輸分超過(guò)多少稱大殺板人 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;
//判斷機(jī)器編號(hào)輸入是否正確
iTemp = StrToInt(edtMachCode->Text);
if(iTemp < 0 || iTemp > 32000)
{
Application->MessageBoxA("機(jī)器編號(hào)輸入錯(cuò)誤,請(qǐng)輸入0-32000之間的數(shù)據(jù)!", "輸入錯(cuò)誤", MB_OK);
edtMachCode->SetFocus();
return;
}
//判斷隨機(jī)碼輸入是否正確
iTemp = StrToInt(edtRandCode->Text);
if(iTemp < 0 || iTemp > 4000)
{
Application->MessageBoxA("隨機(jī)碼輸入錯(cuò)誤,請(qǐng)輸入0-4000之間的數(shù)據(jù)!", "輸入錯(cuò)誤", MB_OK);
edtRandCode->SetFocus();
return;
}
//設(shè)置加密的數(shù)據(jù)緩沖
SetDataBuff(In);
//加密數(shù)據(jù)
Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), ENCRYPT);
//將加密后的數(shù)據(jù)轉(zhuǎn)換成用十進(jìn)制表示
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];
//將整數(shù)轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)放在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);
//設(shè)置輸入緩沖
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);
//解密數(shù)據(jù)
Des_Go(Out, In, sizeof(In), des_key, sizeof(des_key), DECRYPT);
//分析解密數(shù)據(jù)
memset(Buff, 0, 64);
if(!BeatCode(Out, Buff))
{
Application->MessageBoxA("您輸入的卡號(hào)不正確!", "輸入錯(cuò)誤", MB_OK);
}
}
//---------------------------------------------------------------------------
void __fastcall TfrmMain::btnExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -