int Envir_message::C2000_BB3_Data(unsigned char *data, DevMonitorDataPtr data_ptr, int nDataLen, int &iaddcode) { iaddcode = d_devInfo.iAddressCode; if(data[7]==0x02) { unsigned char bdata1; bdata1 = data[9]; DataInfo dainfo; dainfo.bType = true; for(int i=0;i<8;++i) { dainfo.fValue = Getbit(bdata1,i); data_ptr->mValues[i] = dainfo; } } else if(data[1]==0x01) { unsigned char bdata1; bdata1 = data[9]; DataInfo dainfo; dainfo.bType = true; for(int i=0;i<2;++i) { dainfo.fValue = Getbit(bdata1,i); data_ptr->mValues[i+8] = dainfo; } } return RE_SUCCESS; }
int Envir_message::NT511_AD_Data(unsigned char *data, DevMonitorDataPtr data_ptr, int nDataLen, int &iaddcode) { iaddcode = data[0]; DataInfo dainfo; dainfo.bType = false; for(int i=0;i<4;++i) { dainfo.fValue = data[3+2*i]*256+data[4+2*i]-20; data_ptr->mValues[i] = dainfo; } dainfo.bType = true; for(int j=0;j<4;++j) { dainfo.fValue = Getbit(data[12+2*j],1); data_ptr->mValues[4+6*j] = dainfo; dainfo.fValue = Getbit(data[12+2*j],2); data_ptr->mValues[5+6*j] = dainfo; dainfo.fValue = Getbit(data[12+2*j],3); data_ptr->mValues[6+6*j] = dainfo; dainfo.fValue = Getbit(data[12+2*j],4); data_ptr->mValues[7+6*j] = dainfo; dainfo.fValue = Getbit(data[12+2*j],6); data_ptr->mValues[8+6*j] = dainfo; dainfo.fValue = Getbit(data[12+2*j],7); data_ptr->mValues[9+6*j] = dainfo; } //cout<<"wendu="<<data_ptr->mValues[0].fValue<<"--"<<data_ptr->mValues[1].fValue<<"--"<<data_ptr->mValues[2].fValue<<endl; return RE_SUCCESS; }
////////////////////////////////////////////////////////////////////// // Перекодирование исходных данных в "строку" void CInKey::ConvertSourceToBitData(char *prgbSourceBuffer, long int lSourceSize, char *prgbBitData) { long int i, j; int nbit; // Обрабатываем каждый из символов исходной гаммы... for (i = 0, j = 0; i < lSourceSize; i++) { // В байте 8 бит, извлекаем каждый... for (nbit = 0; nbit < NBITS; nbit++, j++) { prgbBitData[j] = Getbit(prgbSourceBuffer[i], nbit); } } }
////////////////////////////////////////////////////////////////////// // УСТАНАВЛИВАЕТ ИНДЕКС iMVS и РЕАЛИЗУЕТ ЕГО (перемешивание битов) void CInKey::MixBitData(long int lSourceSize, char *prgbPasswordBuffer, char *prgbBitData, long int L, long int R, int mode) { int iMVS; // Индекс в массиве указателей на char-векторы // перестановок int nbit, nbit2 = 0; long int i, lIndexTarget, lIndexSource; // Этот union необходим для формирования индекса в MVS // Индекс складывается из двух байтов парольного блока // При следующей итерации происходит смещение "рамки // считывания" двух байт по буферу парольного файла static TCharToInt charToInt; // Инициализируем "исходный" блок данных в union-е // данными, взятыми из парольного блока данных charToInt.rgbVariable[0] = prgbPasswordBuffer[L]; charToInt.rgbVariable[1] = prgbPasswordBuffer[R]; // Осуществляем преобразование Char[2] --> Int iMVS = charToInt.intVariable; // Нормализуем индекс ВЫБОРА ТЕКУЩЕГО ВЕКТОРА if (iMVS > (MVS_NUM - 1)) { iMVS -= MVS_NUM; } // РЕАЛИЗУЕМ ВЕКТОР ПЕРЕСТАНОВКИ ДАННЫХ: // Необходимо ВСЕ N-е Б И Т Ы исходного блока // поместить в N-ый "С Т О Л Б Е Ц" блока-близнеца for (nbit = 0; nbit < NBITS; nbit++) { // N-ых битов столько, сколько байтов в блоке исходных данных for (i = 0; i < lSourceSize; i++) { // При переносе данных всегда пишем в массив-близнец // НОРМАЛЬНАЯ АДРЕСАЦИЯ - ЧТЕНИЕ ПО СТРОКАМ - // nbit * lSourceSize + i // ТРАНСПОНИРОВАННАЯ АДРЕСАЦИЯ - ЧТЕНИЕ ПО СТОЛБЦАМ - // nbit * i + lSourceSize // Режим адресации напрямую зависит от режима работы // программы - шифрование или расшифровка switch (mode) { case ENCRYPT: { // Берем по вектору - пишем подряд lIndexSource = (long int)((prgubMVS[iMVS * NBITS + nbit])\ * lSourceSize + i); lIndexTarget = nbit * lSourceSize + i; break; } case DECRYPT: { // Берем подряд - пишем по вектору lIndexSource = nbit * lSourceSize + i; lIndexTarget = (long int)prgubMVS[iMVS * NBITS + nbit]\ * lSourceSize + i; } } // Учитываем возможное смещение на вторую часть массива // "битовых" данных // Если читаем из второй части массива, то // bitDataPosition != 0, следовательно, необходимо // добавить "довесок" к "исходному" индексу... if (bitDataPosition != 0) { lIndexSource += (NBITS * lSourceSize); } else // ... а если bitDataPosition==0, то для // корректной записи в более высокий слой // также вносим "довесок" { lIndexTarget += (NBITS * lSourceSize); } // Перемещаем данные prgbBitData[lIndexTarget] = (prgbBitData[lIndexSource]\ ^ Getbit(prgbPasswordBuffer[i], nbit2)); nbit2++; if (nbit2 >= NBITS) { nbit2 = 0; } } } // "Перекидываем" указатель на один из двух логических подмассивов // в массиве prgbBitData bitDataPosition ^= (char)0x01; }
int SgTransmmit::RY_3KwPdmData(unsigned char *data, DevMonitorDataPtr data_ptr, int nDataLen, int &runstate) { if(data[2]!=0x10) return RE_CMDACK; DataInfo dainfo; int nbase=4; char data1=AsciiToInt(data[nbase+6]); char data2=AsciiToInt(data[nbase+7]); char data3=AsciiToInt(data[nbase+8]); char data4=AsciiToInt(data[nbase+9]); char data5=AsciiToInt(data[nbase+10]); char data6=AsciiToInt(data[nbase+11]); dainfo.bType = false; dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[0] = dainfo; data1=AsciiToInt(data[nbase+12]); data2=AsciiToInt(data[nbase+13]); data3=AsciiToInt(data[nbase+14]); data4=AsciiToInt(data[nbase+15]); data5=AsciiToInt(data[nbase+16]); data6=AsciiToInt(data[nbase+17]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[1] = dainfo; if(data_ptr->mValues[0].fValue>data_ptr->mValues[1].fValue) { dainfo.fValue = sqrt((data_ptr->mValues[0].fValue+data_ptr->mValues[1].fValue)/(data_ptr->mValues[0].fValue-data_ptr->mValues[1].fValue)); } else{ dainfo.fValue = 0; } data_ptr->mValues[2] = dainfo; data1=AsciiToInt(data[nbase]); data2=AsciiToInt(data[nbase+1]); data3=AsciiToInt(data[nbase+2]); data4=AsciiToInt(data[nbase+3]); data5=AsciiToInt(data[nbase+4]); data6=AsciiToInt(data[nbase+5]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[3] = dainfo; for(int i=0;i<5;++i) { data1=AsciiToInt(data[nbase+18+6*i]); data2=AsciiToInt(data[nbase+19+6*i]); data3=AsciiToInt(data[nbase+20+6*i]); data4=AsciiToInt(data[nbase+21+6*i]); data5=AsciiToInt(data[nbase+22+6*i]); data6=AsciiToInt(data[nbase+23+6*i]); dainfo.fValue = (((data2&0x0F)<<4)|(data1&0x0F))*0.01+(((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F)); data_ptr->mValues[4+i] = dainfo; } for(int j=0;j<2;++j) { data3=AsciiToInt(data[nbase+48+4*j]); data4=AsciiToInt(data[nbase+49+4*j]); data5=AsciiToInt(data[nbase+50+4*j]); data6=AsciiToInt(data[nbase+51+4*j]); dainfo.fValue = ((((((data6&0x0F)<<4)|(data5&0x0F))<<4)|(data4&0x0F))<<4)|(data3&0x0F); data_ptr->mValues[9+j] = dainfo; } dainfo.bType = true; for(int k=0;k<3;++k) { data1=AsciiToInt(data[nbase+56+k]); for(int i=0;i<4;++i) { dainfo.fValue = (Getbit(data1,i)==0 ? 1:0); data_ptr->mValues[11+k*4+i] = dainfo; } } return RE_SUCCESS; }