Алгоритм FOXCHKSUM - PullRequest
       5

Алгоритм FOXCHKSUM

0 голосов
/ 01 декабря 2010

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

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


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

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

-

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

Ответы [ 5 ]

2 голосов
/ 01 декабря 2010

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

0 голосов
/ 16 июня 2013

Тестирование слегка обновленного алгоритма в 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
0 голосов
/ 02 декабря 2010

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

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

Вот это на 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 голосов
/ 01 декабря 2010

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

0 голосов
/ 01 декабря 2010

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

...