2010-12-01 1 views
0

Кто знает, как эта функция вычисляет значения контрольной суммы?Алгоритм FOXCHKSUM

Моя цель - переписать приложение FoxPro на .NET, сохранив старую базу данных, но некоторые значения в БД были рассчитаны с помощью этой функции.


Вопрос закрыт.

Я не заметил, что FOXCHKSUM является внутренней функцией в проекте.

-

Но, в любом случае, спасибо за aswers!

ответ

0

Если это интересно кому-то - я нашел Foxpro алгоритм, который Calc CRC16 и CRC32 с функциями SYS (2107) и SYS (2007). (См. Ответ @Stuart DunkeId).

На самом деле это не CRC, а калькуляция контрольной суммы. В любом случае эта функция возвращает тот же результат, что и foxpro analog.

Вот это на C#:

public static uint Crc(byte[] bytes, uint seed = (uint)0, int lcBitLen = 16) 
    { 
     var laPower = new byte[] { 0x1, 0x2, 0x4, 0x8, 0x10, 0x20, 0x40, 0x80 }; 
     var lnBitLen = lcBitLen == 32 ? 0x8005 : 0x1021; // 1021 hex (16bit), 8005 hex (32bit) 
     var lnCrc = seed == 0 ? 0xffffffff : seed;  // Reset for Each Text Block 
     foreach (var byteVal in bytes) 
     { 
      for (var inLoop = 7; inLoop >= 0; inLoop--) 
      { 
       var testBit = ((lnCrc & 0x8000) == 0x8000 && (byteVal & laPower[inLoop]) != laPower[inLoop]) 
           || ((lnCrc & 0x8000) != 0x8000 && (byteVal & laPower[inLoop]) == laPower[inLoop]); 
       lnCrc = (lnCrc & 0x7fff)*2; 
       if (testBit) 
        lnCrc = (uint)(lnCrc^lnBitLen); 
      } 
     } 
     return lnCrc; 
    } 
0

В Foxpro Вы можете создать класс со способом, который использует функцию FOXCHKSUM. Затем скомпилируйте его в dll COM, а затем используйте его в коде .NET.

0

Из-за очевидных звуков его, пытаясь рассчитать некоторое значение контрольной суммы ... возможно, уровень записи или конкретное полевое содержимое. Я бы посмотрел в исходном коде VFP, чтобы узнать, что передается вызову функции, чтобы вернуть результаты. Затем я заглянул в библиотеки .Net, которые также рассматривают шифрование/контрольные суммы, такие как MD5, как простые. Затем вы можете попробовать вызвать стандартную функцию .net с той же строкой, пока не выясните, какой из них дает вам те же результаты, тогда вам не нужно иметь дело с COM. Я даже не знаю, является ли FoxChkSum кодированной функцией VFP или внешним .fll или .dll. Если его код VFP, я, вероятно, смогу помочь его дешифровать для вас.

2

Функции контрольной суммы FoxPro SYS(2107) и SYS(2007) используют CRC16 or CRC32 для расчета значений контрольной суммы. Возможно ли, что функция FOXCHKSUM обертывает их?

0

Тестирование слегка обновленный алгоритм в Visual FoxPro (я ленив, чтобы установить C#): CRC16 работает хорошо, но CRC32 дает разные результаты ...

aa = 'bbb' 
? aa 
? SYS(2007,aa,0,0) 
? sys2007(aa,0) 

FUNCTION sys2007 
LPARAMETERS lcString, lnBitFlag 

LOCAL lnBitLen, lnCRC, inLoop, n 
lnBitLen = IIF(BITTEST(m.lnBitFlag,0), 0x8005, 0x1021) 

lnCRC = 0xffffffff 

FOR n = 1 TO LEN(m.lcString) 
    byteVal = ASC(SUBSTR(m.lcString, m.n, 1)) 
    FOR inLoop = 7 TO 0 STEP -1 
    testbit = BITTEST(m.lnCRC, 15) AND !BITTEST(byteVal, inLoop) OR ; 
       !BITTEST(m.lnCRC, 15) AND BITTEST(byteVal, inLoop) 
    lnCRC = BITLSHIFT(BITAND(m.lnCRC, 0x7fff), 1) 
    IF testbit 
     lnCRC = BITXOR(m.lnCRC, m.lnBitLen) 
    ENDIF 
    NEXT 
NEXT 

RETURN m.lnCRc 

 Смежные вопросы

  • Нет связанных вопросов^_^