:: Visual Foxpro, Foxpro for DOS
crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Приветствую всех.

Помогите пожалуйста портировать код с++ на Visual FoxPro.

/*
* Improved calculation of CRC-64 values for protein sequences
* By David T. Jones (''.phorum_html_encode('dtj@cs.ucl.ac.uk').'') - September 28th 2002
*
* Modified from code at URL:
* ftp.ebi.ac.uk
*/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
/* If you want to try the old CRC-64 function, currently employed in
SWISSPROT/TrEMBL then uncomment the next line */
/* #define OLDCRC */
#ifdef OLDCRC
#define POLY64REV 0xd800000000000000ULL
#define INITIALCRC 0x0000000000000000ULL
#else
#define POLY64REV 0x95AC9329AC4BC9B5ULL
#define INITIALCRC 0xFFFFFFFFFFFFFFFFULL
#endif
void crc64(char *seq, char *res)
{
int i, j, low, high;
unsigned long long crc = INITIALCRC, part;
static int init = 0;
static unsigned long long CRCTable[256];
if (!init)
{
init = 1;
for (i = 0; i < 256; i++)
{
part = i;
for (j = 0; j < 8; j++)
{
if (part & 1)
part = (part >> 1) ^ POLY64REV;
else
part >>= 1;
}
CRCTable = part;
}
}
while (*seq)
crc = CRCTable[(crc ^ *seq++) & 0xff] ^ (crc >> 8);
/*
The output is done in two parts to avoid problems with
architecture-dependent word order
*/
low = crc & 0xffffffff;
high = (crc >> 32) & 0xffffffff;
sprintf (res, "%08X%08X", high, low);
return;
}
void main (int argc, char *argv[])
{
char *testseq1 = "MNIIQGNLVGTGLKIGIVVGRFNDFITSKLLSGAEDALLRHGVDTNDIDV
AWVPGAFEIPFAAKKMAETKKYDAIITLGTVIRGATTSYDYVCNEAAKGIAQ
AANTTGVPVIFGIVTTENIEQAIERAGTKAGNKGVDCAVSAIEMANLNRSFE";
char *testseq2 = "MNIIQGNLVGTGLKIGIVVGRFNDFITSKLLSGAEDALLRHGVDTNDIDV
AWVPGAFEIPFAAKKMAETKKYDAIITLGDVIRGATTHYDYVCNEAAKGIAQ
AANTTGVPVIFGIVTTENIEQAIERAGTKAGNKGVDCAVSAIEMANLNRSFE"; /* Differs from 1st seq in two places */
char result[20];
crc64(testseq1, result);
printf("The CRC-64 for sequence %s is %s\n", testseq1, result);
crc64(testseq2, result);
printf("The CRC-64 for sequence %s is %s\n", testseq2, result);
}

* Visual FoxPro function
FUNCTION crc64
LPARAMETERS seq
LOCAL i, j, k, low, high, crc, part, CRCTable[256]
#define POLY64REV 0x95AC9329AC4BC9B5
#define INITIALCRC 0xFFFFFFFFFFFFFFFF
crc = INITIALCRC
FOR i=0 TO 255
part = i
FOR j = 1 TO 8
IF BITAND(part,1) = 1
part = BITXOR(BITRSHIFT(part,1),POLY64REV)
ELSE
part = BITRSHIFT(part,1)
ENDIF
ENDFOR
CRCTable[i+1] = part
ENDFOR
FOR k = 1 TO LEN(seq)
crc = BITXOR(CRCTable[BITAND(BITXOR(crc,ASC(SUBSTR(seq,k,1))),255)],BITRSHIFT(crc,8))
ENDFOR
low = BITAND(crc,18446744073709551615)
high = BITAND(BITRSHIFT(BITRSHIFT(crc,16),16),18446744073709551615)
RETURN STR(high) + ' ' + STR(low)
ENDFUNC

Эта версия crc64 на фоксе возращает одни нули.



[i]Исправлено 1 раз(а). Последнее : NOVLAN, 22.12.15 18:11
Ratings: 0 negative/0 positive
Re: crc64
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Такие большие числа фокс не сьест просто так, в нем Integer 32 битный.
(См. например, forum.foxclub.ru )
Ratings: 0 negative/0 positive
Re: crc64
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
NOVLAN
Помогите пожалуйста портировать код с++ на Visual FoxPro.
Не надо этого делать. Лучше почитай как делаются fll и допиши то что нужно для того чтобы именно сишный код и вызывать из фокса. Благо он возвращает "строковое представление", а не 64-битное число, которое фокс не сможет переварить (разве что извратиться с Currency типом).
Будет надёжно, быстро, правильно. Портировать это на фокс, попутно прикручивая самодельные вычисления для 64-битных целых - ненадёжно, медленно и убого.
Теоретически, конечно, можно и без fll обойтись - взять из скомпилированной сишной проги машинный код данной функции и хитрым способом вставить в фокс - но это всяко сложнее чем пойти по пути создания fll... Впрочем, можно и не fll а ординарную dll сделать и подключать через DECLARE ... IN ... Тут особой нужды именно в доступе к фоксовому АПИ нету...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Если не получится с ассемблерной вставкой (forum.foxclub.ru), буду воять fll-ку.
Спасибо.
Ratings: 0 negative/0 positive
Re: crc64
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
Что-то не пойму. Особый спец алгоритм используется?
Вообще на форуме масса ссылок на формирование хэша от строки и на готовые варианты через API или FLL.
MD5*, SHA1, SHA2 - поиск по форуму.

Про ассемблерную вставку от Леонида скажу: все здорово работает. Но при массированном использовании утечка памяти что-ли. Валит приложение (а может и систему - не помню деталей).

++
forum.foxclub.ru



Исправлено 1 раз(а). Последнее : Taran, 21.12.15 23:27
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Taran
Что-то не пойму. Особый спец алгоритм используется?

Та не. Вроде обычный CRC64.

Taran
Вообще на форуме масса ссылок на формирование хэша от строки и на готовые варианты через API или FLL.
MD5*, SHA1, SHA2 - поиск по форуму.

Хотелось бы именно 64-битный хэш. У MD5, SHA и т.п. хэши от 128-и. Мне 128 и 256 много, а 32 мало.

Taran
Про ассемблерную вставку от Леонида скажу: все здорово работает. Но при массированном использовании утечка памяти что-ли. Валит приложение (а может и систему - не помню деталей).

Спасибо за предостережение.



Исправлено 1 раз(а). Последнее : NOVLAN, 22.12.15 01:12
Ratings: 0 negative/0 positive
Re: crc64
Taran

Сообщений: 13626
Откуда: Красноярск
Дата регистрации: 16.01.2008
NOVLAN
Хотелось бы именно 64-битный хэш. У MD5, SHA и т.п. хэши от 128-и. Мне 128 и 256 много, а 32 мало.
По моему - зря заморачиваешься. Напишешь даже если что - попользуешь и бросишь.
Ибо есть стандартные библиотеки и пр.. А у них скорее всего и скорость будет превосходить твой вариант.
А хранить чуток лишнего? Так это нынче не проблема.

Насчет предостережения от ассемблерной вставки.
Вероятно тебе это и не помешает. У меня просто задача крутилась круглосуточно и за 7-10 дней вываливалась.
Перешел на API и проблема исчезла.
Ratings: 0 negative/0 positive
Re: crc64
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
NOVLAN
Хотелось бы именно 64-битный хэш. У MD5, SHA и т.п. хэши от 128-и. Мне 128 и 256 много, а 32 мало.
Зато некоторые из них реализуются в штатном виндовом cryptoAPI - т.е. можно обойтись только DECLARE DLL. Для MD5 есть пример аналогично будет и для разных вариантов SHA (просто подставить другие значения константы "кода алгоритма", ну и размеры буфера подправить по размеру хэша).
64бита хэша всё же весьма мало на сегодняшний день...


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: crc64
Рома
Автор

Сообщений: 1079
Дата регистрации: 06.06.2001
NOVLAN
Если не получится с ассемблерной вставкой (forum.foxclub.ru), буду воять fll-ку.
Спасибо.

Не мучайся c fll - там обычная dll получается 2,5Kb без зависимостей от C runtime и даже kernel32
Ratings: 0 negative/1 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Taran
По моему - зря заморачиваешься. Напишешь даже если что - попользуешь и бросишь.

Я уже больше 20-ти лет "заморачиваюсь". Ну нравится мне это дело. ;) Пока есть желание, силы и усидчивость, предпочитаю нативный код. Да и задача не срочная. Не было бы времени на разработку - в 5 сек. прикрутил бы стороннюю fll-ну и забыл бы. Но это же не кашерно.
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Igor Korolyov
64бита хэша всё же весьма мало на сегодняшний день...

Мне бы для уникального идентификатора блока данных хватило бы.
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Рома
NOVLAN
Если не получится с ассемблерной вставкой (forum.foxclub.ru), буду воять fll-ку.
Спасибо.

Не мучайся c fll - там обычная dll получается 2,5Kb без зависимостей от C runtime и даже kernel32

А мне одинаково что fll что dll всё равно мучаться копать долго буду. Я как подумаю: "Ставить студию, создавать сишный проект, компилить под win32/win64..."
Мрак
Хотя может как-то без студии, с консоли скомпилировать получится...
Ratings: 0 negative/0 positive
Re: crc64
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Можно все и на "чистом" фоксе реализовать, будет помедленнее, чем на си. Вместо одной Integer-переменной надо две использовать (пару, старшее и младшее слово), констант разных - тоже пары. Сдвиги, тесты бита, сделать с учетом этого...
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Мне суперскорось не нужна. На счет 2-х integer-ов меня тоже такая мысль посещала, когда сравнивал коды CRC16 и CRC32, но как воплотить пока не придумал.
Ratings: 0 negative/0 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Рома
NOVLAN
Если не получится с ассемблерной вставкой (forum.foxclub.ru), буду воять fll-ку.
Спасибо.

Не мучайся c fll - там обычная dll получается 2,5Kb без зависимостей от C runtime и даже kernel32

Вложения: [crc64.zip (5.3KB)]

Роман! Я сразу не заметил вложения - Спасибо! Это просто праздник какой-то!
Ratings: 0 negative/0 positive
Re: crc64
of63

Сообщений: 25256
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
А че там воплощать? Например, напиши функцию, реализующую:
BITRSHIFT2(par1, par2) - сдвигает эту пару вправо на 1 бит (перенос из левого слова в правое слово приделаешь). Возвращает младшее слово
BITRSHIFT2(par1, par2, 1) - сдвигает эту пару вправо на 1 бит (перенос из левого слова в правое слово приделаешь). Возвращает старшее слово

Пример использования с 64 битным значением представленным парой 2х Integer-32 {y,x}, вместо BITRSHIFT:
x = ... && младшие 32 бит
y = ... && старшие 32 бит

* сдвигаем вправо всю пару {y,x}:
a = BITRSHIFT2(x, y)
b = BITRSHIFT2(x, y, 1)
x = a
y = b

Надеюсь, идея понятна, просто немного внимательнее надо относиться к подобным парам {I,I}, а не просто:
x = BITRSHIFT2(x, y) && Внимание! Исходный x "испорчен", но он нужен следующему вызову сдвигателя, которому нужен именно исходный {y,x}
y = BITRSHIFT2(x, y, 1)

Ну, и другие нужные операторы также сделать.


(Можно и на символьных строках типа Q сдедать, но в случае "64 бита" проще конструировать операторы и из пар 32-переменных)
Ratings: 0 negative/1 positive
Re: crc64
NOVLAN

Сообщений: 103
Откуда: Харьков
Дата регистрации: 16.11.2005
Спасибо за идею. Попробую реализовать.
Ratings: 0 negative/0 positive
Re: crc64
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
Не советую для продуктива. Как разминку для ума - дазарадибога
NOVLAN
может как-то без студии, с консоли скомпилировать получится...
Конечно - компиляторов то хватает - gcc тот же. win64 тебе не нужен, его фокс скушать не смогёт.


------------------
WBR, Igor
Ratings: 0 negative/0 positive
Re: crc64
bd

Сообщений: 153
Откуда: Aktau
Дата регистрации: 23.02.2006
Если важна только длина хэша, то можно разбить данные на две части и для каждой части посчитать crc32.


------------------
Нет ничего плохого в том, чтобы соорудить нечто и понять, что оно не работает.
(хочу сделать универсальную систему учета для коммунальщиков, не важно на чем)
Ratings: 0 negative/0 positive
Re: crc64
Igor Korolyov

Сообщений: 34580
Дата регистрации: 28.05.2002
bd
Если важна только длина хэша, то можно разбить данные на две части и для каждой части посчитать crc32.
Глубочайшее непонимание того что такое хэш, или (что по сути то же самое) контрольная сумма...


------------------
WBR, Igor
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 45 (Гостей: 45)

© 2000-2024 Fox Club 
Яндекс.Метрика