перевод код с vc++ на c#
От: alex2a  
Дата: 29.03.08 13:16
Оценка:
Диар ол..
у меня есть чудовищный код, доставшийся мне от индусов, который должен считать crc16. у меня есть класс, считающий crc и когда я увидел *это*, я заплакал..
я мало знаком с темплэйтами и прочим в vc++, поэтому я не понимаю совершенно как работает этот код.. помогите, пожалуйста разобраться:

WORD CBZXMessage::GetCRC(const CString &sFName, WORD nSerial,long newparameter)
{
    USES_CONVERSION;
 union 
    {
        WORD uWholeWord;
        struct 
        {
            BYTE Low;
            BYTE High;
        }
        ucByte;
    }
    uCRC;
 deque<BYTE> byteQ;
 BYTE bByte;
 bool bRetVal = false;
 WORD nFileCRC = 0;
    uCRC.uWholeWord = nSerial;
 ifstream ifs;
 ifs.open(T2CA(sFName), ios_base::binary );
 while ( ios::goodbit == ifs.rdstate())
 {
  char c;
  ifs.get(  c);
  bByte = c;
  byteQ.push_back( bByte);
  if( byteQ.size() > newparameter) // 7 == magic number ( last char in file is read twice cos ios::eofbit
        //        is only set when a read fails + 4 for CRC + 0x0d + 0x0a)
  {
   uCRC.ucByte.Low ^= byteQ.front();
   byteQ.pop_front();
   for ( int j = 0; j < 8; j++)                 /* do 8 times */
   {
    WORD uFlag = uCRC.uWholeWord & 1;        /* shift seed one bit to right */
    uCRC.uWholeWord = uCRC.uWholeWord >> 1;
    if (uFlag)                          /* if a 1 bit was shifted out */
    {
     uCRC.uWholeWord ^= 0xA001;      /* exclusive or A001 to seed */
    }
   }
  }
 }
 ifs.close();
 return uCRC.uWholeWord;
}

newparameter = 7 всегда, nSerial = 0
где используются прочитаные из файла байты? для чего нужны ксоры ucByte.Low, если идет анализ только uWholeWord?.. Check для этой функции: BA04.

Please HELP!!!

29.03.08 21:46: Перенесено модератором из '.NET' — AndrewVK
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.