Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2008.01.13;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.57 MB
Время: 0.008 c
15-1196933701
Kostafey
2007-12-06 12:35
2008.01.13
Тестирование Web - приложений


2-1197880453
Fran
2007-12-17 11:34
2008.01.13
Дата прописью на калмыцком языке


15-1197012661
Бакук
2007-12-07 10:31
2008.01.13
Перенос почты Opera 9 &amp;#151;> Outlook 2003


6-1177322028
Ypbi4
2007-04-23 13:53
2008.01.13
ClientSocket -- получение ответа на запрос


2-1197741528
Elec3C
2007-12-15 20:58
2008.01.13
Проверка клавиш





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский