Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2008.01.13;
Скачать: CL | DM;

Вниз

Как перевести сие на код Дельфи т.е написать функцию?   Найти похожие ветки 

 
XerSon   (2007-12-13 10:07) [0]

CRCTable : array [0..255] of byte = (
     0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
     157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
     35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
     190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
     70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
     219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
     101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
     248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
     140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
     17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
     175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
     50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
     202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
     87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
     233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
     116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53);

KeyCode: array[1..8] of byte;
KeyCode[ 8 ] := 0;

 For j := 1 to 7 do
   KeyCode[ 8 ]  := CRCTable[ KeyCode[ 8 ] xor KeyCode[ j ] ];


 
Сергей М. ©   (2007-12-13 10:13) [1]

Что требуется от функции ?

Опиши назначение и тип входных параметров (если имеются) и результата


 
XerSon   (2007-12-13 10:16) [2]


> Сергей М. ©   (13.12.07 10:13) [1]
>
> Что требуется от функции ?
>
> Опиши назначение и тип входных параметров (если имеются)
> и результата


ТУ
***
Для преобразования кода карточек Виганд в формат кода Dallas TouchMemory необходимо дополнить код Виганд нулевыми битами до 7-ми байт и посчитать для них циклическую контрольную сумму:

8-й байт 5-7 байт 2-4 байт 1-й байт
CRC дополнение до 7-ми байт код Вигант 01

Т.е. на примере кода 011  55982 получается следующий код:
8-й байт 7-й байт 6-й байт 5-й байт 4-й байт 3-й байт 2-й байт 1-й байт
CRC дополнение код Вигант дополнение
   011 55982
05 00 00 00 0B DA AE 01

Циклическая контрольная сумма получается по правилу фирмы Dallas. Расчет осуществляется следующим образом:

 CRCTable : array [0..255] of byte = (
     0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
     157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
     35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
     190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
     70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
     219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
     101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
     248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
     140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
     17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
     175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
     50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
     202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
     87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
     233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
     116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53);

KeyCode: array[1..8] of byte;
KeyCode[ 8 ] := 0;

 For j := 1 to 7 do
   KeyCode[ 8 ]  := CRCTable[ KeyCode[ 8 ] xor KeyCode[ j ] ];

Полученный 8-ми байтный код можно заносить в БД для использования в АРМ «Орион».
***

Вот собственно и все!


 
Anatoly Podgoretsky ©   (2007-12-13 10:16) [3]

> XerSon  (13.12.2007 10:07:00)  [0]

А это и есть код на Дельфи, или ты не умеешь оформить это в виде функции.


 
korneley ©   (2007-12-13 10:18) [4]

Добавить служебных слов. Типа, function, const, var. Да, и j не забыть описАть.


 
XerSon   (2007-12-13 10:19) [5]


> Anatoly Podgoretsky ©   (13.12.07 10:16) [3]
>
> > XerSon  (13.12.2007 10:07:00)  [0]
>
> А это и есть код на Дельфи, или ты не умеешь оформить это
> в виде функции.


Нет не умею! С чем и обратился!


 
Сергей М. ©   (2007-12-13 10:26) [6]

Так тебе надо именно полную функцию преобразования или функцию для расчета CRC для использования в алгоритме преобразования ?


 
XerSon   (2007-12-13 10:56) [7]


> Сергей М. ©   (13.12.07 10:26) [6]
>
> Так тебе надо именно полную  или функцию
> для расчета CRC для использования в алгоритме преобразования
> ?


Если возможно, то полную функцию преобразования а если это будет не скромно, то расчета CRC!


 
Сергей М. ©   (2007-12-13 11:04) [8]

function GetCRC32(const Buffer; Size: Integer): Byte
const
 CRCTable : array [0..255] of byte = (
    0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
    157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
    35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
    190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
    70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
    219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
    101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
    248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
    140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
    17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
    175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
    50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
    202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
    87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
    233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
    116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53);
var
 i: Integer;
begin
 Result := 0;
 for i := 0 to Size - 1 do
   Result  := CRCTable[Result xor PByteArray(@Buffer)[i]];
end;


Пример использования ф-ции для твоего случая:

var
 KeyCode: array[1..8] of byte; //код Dallas TouchMemory
..
 KeyCode[8] := GetCRC32(KeyCode, 7);


 
Slym ©   (2007-12-13 12:35) [9]

так чуть быстрее:
function GetCRC32(const Buffer; Size: Integer): Byte;
const
CRCTable : array [0..255] of byte = (
   0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
   157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
   35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
   190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
   70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
   219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
   101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
   248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
   140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
   17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
   175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
   50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
   202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
   87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
   233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
   116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53);
var Buf:PByteArray;
begin
 Buf:=@Buffer;
 Result:=0;
 repeat
   Result:=CRCTable[Result xor Buf^];
   inc(Buf);
   Dec(Size);
 until Size=0;
end;


 
Сергей М. ©   (2007-12-13 12:48) [10]


> Slym ©   (13.12.07 12:35) [9]


Странно, что для "ускорения" ты оптимизировал работу с буфером, но при этом свел на нет преимущество while над repeat в части производительности


 
XerSon   (2007-12-13 12:48) [11]

Простите за назойливость! Но по причине неопытности, столкнулся с проблемой Использования функции:

Есть два поля ввода: (edit1, edit2) и один Буттон (Button1)

Вводим данные в edit1 //код Виганд
//Жмем на Буттон и проверяем на предмет пустого ввода
...
if edit1.text = "" then
   MessageDlg("Вы не ввели код карты Виганд!", mtWarning, [mbOK], 0)
 else
...
??? Не соображу как Првязать Строковую переменную к массиву!!!
...
//Дополняем код Виганд нулевыми битами до 7-ми байт и посчитать для них циклическую контрольную сумму
...
KeyCode[8] := GetCRC32(KeyCode, 7); // И использовать в преобразовании её?
...


 
Сергей М. ©   (2007-12-13 12:53) [12]


> XerSon   (13.12.07 12:48) [11]


Смотря в каком формате осуществляется ввод пользователем Виганд-кода


 
XerSon   (2007-12-13 12:55) [13]


> Сергей М. ©   (13.12.07 12:53) [12]
>
>
> > XerSon   (13.12.07 12:48) [11]
>
>
> Смотря в каком формате осуществляется ввод пользователем
> Виганд-кода


Формат ввода: 011  55982
или
Формат ввода: 01155982


 
XerSon   (2007-12-13 12:58) [14]


> Сергей М. ©   (13.12.07 12:53) [12]


011  55982 вот из такого числа должно получится такое 050000000BDAAE01


 
Сергей М. ©   (2007-12-13 13:01) [15]

Т.е. 011 - это код помещения, а 55982  - код сотрудника ?


 
XerSon   (2007-12-13 13:02) [16]


> Сергей М. ©   (13.12.07 13:01) [15]


а это критично?


 
Сергей М. ©   (2007-12-13 13:14) [17]

После уточнения в [14] уже не столь.


> 050000000BDAAE01


Что в дан.случае означает единица в младшем байте кода ?


 
XerSon   (2007-12-13 13:26) [18]


> Сергей М. ©   (13.12.07 13:14) [17]


8-й байт  |  7-й байт  |  6-й байт  |  5-й байт  |  4-й байт  |  3-й байт  |  2-й байт  | 1-й байт

  CRC     |                   дополнение                 |                   код Вигант                  | дополнение

               |                  |                  |                   |     011     |            55982             |

     05      |        00      |        00      |        00       |      0B     |     DA    |     AE    |      01

01- Дополнение!


 
Сергей М. ©   (2007-12-13 13:29) [19]


> 01- Дополнение


Мне это ни о чем не говорит, я знаком с кодом тач-мемори лишь понаслышке.

Почему именно 01, а не какое-либо иное число ?
По каким вообще правилам формируется это самое "дополнение" в мл.байте ?
От этого зависит решение.


 
XerSon   (2007-12-13 13:34) [20]


> Сергей М. ©   (13.12.07 13:29) [19]


Это условие Производителя! Только 01! Более ни каких данных на сей момент нет!

Так описано в алгоритме Преобразования!


 
XerSon   (2007-12-13 13:36) [21]


> Сергей М. ©   (13.12.07 13:29) [19]


Могу выслать на мыло Данный док по преобразованию! Хотя он весь в начале темы!


 
Slym ©   (2007-12-13 13:56) [22]

Сергей М. ©   (13.12.07 12:48) [10]
свел на нет преимущество while над repeat в части производительности

какое преимущество?
1. until Size=0; - сравнение с нулем быстрее
2. PByteArray(@Buffer)[i]^ - индекс медленнее чем Buf^
3. единственный баг - нет проверки на исходный size<>0
4. 1ое и 3е можно обединить в while size<>0 do


 
Сергей М. ©   (2007-12-13 14:01) [23]

формат ввода именно такой

3 знака + необязательный пробел + 5 знаков

и никакой другой ?


 
XerSon   (2007-12-13 14:09) [24]


> Сергей М. ©   (13.12.07 14:01) [23]


Многоуважаемый Сергей! На данный момент Да!

Но если формат позже изменится на 8 знаков, то все рухнет коту под хвост, или функцию можно будет оптимизировать под восьми знак?


 
Сергей М. ©   (2007-12-13 14:15) [25]


> если формат позже изменится на 8 знаков


Так он и сейчас 8 знаков, если не считать пробел ..

?


 
Slym ©   (2007-12-13 14:17) [26]

XerSon   (13.12.07 12:48) [11]
Првязать Строковую переменную к массиву

type
 TKeyCode=packed record
   add1:byte;
   key1:word;
   key2:byte;
   add2:array[0..2] of byte;
   crc:byte;
 end;
var str:string;
KeyCode:TKeyCode;
begin
 str:="01155982";
 FillChar(KeyCode,SizeOf(KeyCode),0);
 KeyCode.add1:=1;
 KeyCode.key1:=StrToInt(Copy(str,1,3));
 KeyCode.key2:=StrToInt(Copy(str,4,5));


 
Slym ©   (2007-12-13 14:19) [27]

XerSon   (13.12.07 14:09) [24]
изменится на 8 знаков

str:=StringReplace(str," ","",[rfReplaceAll]);


 
XerSon   (2007-12-13 14:21) [28]


> Сергей М. ©   (13.12.07 14:15) [25]


Беру на себя Формат ввода :) 8 знакофф без пробела! Так будет ИМХО! логичнее и менее геморно!

Итог:
 01155982


 
XerSon   (2007-12-13 14:26) [29]


> Сергей М. ©   (13.12.07 14:15) [25]


Сие взято от сюда: http://www.bolid.ru/support/tech/faq/object/orion/?curPos=90


 
Slym ©   (2007-12-13 14:36) [30]

program Project1;

{$APPTYPE CONSOLE}

uses
 SysUtils;

type
TKeyCode=packed record
  add1:byte;
  key1:word;
  key2:byte;
  add2:array[0..2] of byte;
  crc:byte;
end;

procedure SetKeyCodeCRC(var KeyCode:TKeyCode);
const
CRCTable : array [byte] of byte = (
  0,94,188,226,97,63,221,131,194,156,126,32,163,253,31,65,
  157,195,33,127,252,162,64,30,95,1,227,189,62,96,130,220,
  35,125,159,193,66,28,254,160,225,191,93,3,128,222,60,98,
  190,224,2,92,223,129,99,61,124,34,192,158,29,67,161,255,
  70,24,250,164,39,121,155,197,132,218,56,102,229,187,89,7,
  219,133,103,57,186,228,6,88,25,71,165,251,120,38,196,154,
  101,59,217,135,4,90,184,230,167,249,27,69,198,152,122,36,
  248,166,68,26,153,199,37,123,58,100,134,216,91,5,231,185,
  140,210,48,110,237,179,81,15,78,16,242,172,47,113,147,205,
  17,79,173,243,112,46,204,146,211,141,111,49,178,236,14,80,
  175,241,19,77,206,144,114,44,109,51,209,143,12,82,176,238,
  50,108,142,208,83,13,239,177,240,174,76,18,145,207,45,115,
  202,148,118,40,171,245,23,73,8,86,180,234,105,55,213,139,
  87,9,235,181,54,104,138,212,149,203,41,119,244,170,72,22,
  233,183,85,11,136,214,52,106,43,117,151,201,74,20,246,168,
  116,42,200,150,21,75,169,247,182,232,10,84,215,137,107,53);
var
 Buf:PByte;
 crc,Size:byte;
begin
crc:=0;
Buf:=@KeyCode;
Size:=SizeOf(KeyCode)-1;
repeat
  crc:=CRCTable[crc xor Buf^];
  inc(Buf);
  Dec(Size);
until Size=0;
KeyCode.crc:=crc;
end;

function KeyCodeToStr(const KeyCode:TKeyCode):string;
var
 Buf:PByte;
 Size:byte;
begin
 result:="";
 Buf:=@KeyCode;
 Size:=SizeOf(KeyCode);
 repeat
   result:=IntToHex(Buf^,2)+result;
   inc(Buf);
   Dec(Size);
 until Size=0;
end;

var
 str:string;
 KeyCode:TKeyCode;
begin
str:="01155982";
FillChar(KeyCode,SizeOf(KeyCode),0);
KeyCode.add1:=1;
KeyCode.key2:=StrToInt(Copy(str,1,3));
KeyCode.key1:= StrToInt(Copy(str,4,5));
SetKeyCodeCRC(KeyCode);
writeln(KeyCodeToStr(KeyCode));
readln;
end.


 
XerSon   (2007-12-13 14:46) [31]


> Slym ©   (13.12.07 14:36) [30]


Спасибо за Ваш взгляд гуру на мою тему! ИМХО! Визуально не консоль нужна! А по Выполнению + 5

Но мне нужно поле ввода, не буду же я каждый раз исходник компилить с новым кодом :)

И еще раз спасибо за понимание, время, работу мозгами а не энным местом, в моем случае!


 
Сергей М. ©   (2007-12-13 14:46) [32]


> Итог:
>  01155982
>


Тогда все просто:

type
TWiegandCode = packed array
   Lo: Word;
   Hi: Byte;
end;

TTouchMemCode = array[0..7] of Byte;
var
wc: TWiegandCode;
tmc: TTouchMemCode;
..

function W2TM(Src: TWiegandCode): TTouchMemCode;
begin
..
end;

wc.Hi := Byte(StrToInt(Copy(Edit.Text, 1, 3)))
wc.Lo := Word(StrToInt(Copy(Edit.Text, 4, 5)))
tmc := W2TM(wc);


 
Сергей М. ©   (2007-12-13 14:56) [33]

+ к [32]

function W2TM(Src: TWiegandCode): TTouchMemCode;
begin
 FillChar(Result, SizeOf(Result), 0);
 Result[0] := 1;
 PWord(@Result[1])^ := Src.Lo;
 PByte(@Result[3])^ := Src.Lo;
 Result[7] := GetCRC32(Result, 7);
end;


 
Сергей М. ©   (2007-12-13 14:57) [34]

Поправка:

PByte(@Result[3])^ := Src.Hi;


 
XerSon   (2007-12-13 14:59) [35]


> Сергей М. ©   (13.12.07 14:46) [32]


А можно весь Юнит выложить? Буду премного благодарен, за проявленный интерес и выполненную работу!

Прошу Извенить за наглость и не скромность! у вас и без меня, дел по помощю не в проворот а тут еще и нахал типа меня нарисовался!


 
Сергей М. ©   (2007-12-13 15:05) [36]


> можно весь Юнит выложить?


Нет никакого юнита)

Все, что ты видишь, в т.ч. и от ув. Slym (c), верстается "с колес")


> Буду благодарен за .. выполненную .. работу


Ты , видимо, ошибся ресурсом)

Здесь monter_mechnikoff.ru, а не bogadelnia.org)


 
XerSon   (2007-12-13 15:08) [37]


> Сергей М. ©   (13.12.07 15:05) [36]


Не в коей мере не хотел Вас обидеть и тем более ущемить ваше не ущемляемое Достоинство! Сорри если что не так!!! Еще раз Огромное спс и респект!


 
XerSon   (2007-12-13 15:09) [38]

А сейчас по ходу и дядя Толя Нарисуется с Отбривом)


 
Сергей М. ©   (2007-12-13 15:13) [39]


> XerSon   (13.12.07 15:09) [38]


Шифруешься ?)


 
Anatoly Podgoretsky ©   (2007-12-13 15:15) [40]

> XerSon  (13.12.2007 15:09:38)  [38]

Я пока смотрю со стороны, наблюдаю за порядком.



Страницы: 1 2 вся ветка

Текущий архив: 2008.01.13;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.021 c
15-1197103154
Igor Zorkov
2007-12-08 11:39
2008.01.13
Хостинге


15-1197264407
Gydvin
2007-12-10 08:26
2008.01.13
windows server 2003 и русские названия папок


15-1197018644
Greench
2007-12-07 12:10
2008.01.13
Скобки в арифметическом выражении


2-1197643683
Sallity
2007-12-14 17:48
2008.01.13
Задача про машини


2-1197462986
altatr
2007-12-12 15:36
2008.01.13
Отключить проверку заглавных букв