![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перевести сие на код Дельфи т.е написать функцию? [D7, XP]
XerSon © (2007-12-13 10:07:00)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 14:57:00) [21]Поправка:
PByte(@Result[3])^ := Src. Hi;
Сергей М. (2007-12-13 14:56:00) [22]+ к [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:46:00) [23]
> Итог:
> 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);
XerSon (2007-12-13 14:46:00) [24]
> Slym © (13.12.07 14:36) [30]
Спасибо за Ваш взгляд гуру на мою тему! ИМХО! Визуально не консоль нужна! А по Выполнению + 5
Но мне нужно поле ввода, не буду же я каждый раз исходник компилить с новым кодом :)
И еще раз спасибо за понимание, время, работу мозгами а не энным местом, в моем случае!
Slym (2007-12-13 14:36:00) [25]
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:26:00) [26]
> Сергей М. © (13.12.07 14:15) [25]
Сие взято от сюда: http://www.bolid.ru/support/tech/faq/object/orion/?curPos=90
XerSon (2007-12-13 14:21:00) [27]
> Сергей М. © (13.12.07 14:15) [25]
Беру на себя Формат ввода :) 8 знакофф без пробела! Так будет ИМХО! логичнее и менее геморно!
Итог:
01155982
Slym (2007-12-13 14:19:00) [28]XerSon (13.12.07 14:09) [24]
изменится на 8 знаков
str:=StringReplace(str,' ','',[rfReplaceAll]);
Slym (2007-12-13 14:17:00) [29]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));
Сергей М. (2007-12-13 14:15:00) [30]
> если формат позже изменится на 8 знаков
Так он и сейчас 8 знаков, если не считать пробел ..
?
XerSon (2007-12-13 14:09:00) [31]
> Сергей М. © (13.12.07 14:01) [23]
Многоуважаемый Сергей! На данный момент Да!
Но если формат позже изменится на 8 знаков, то все рухнет коту под хвост, или функцию можно будет оптимизировать под восьми знак?
Сергей М. (2007-12-13 14:01:00) [32]формат ввода именно такой
3 знака + необязательный пробел + 5 знаков
и никакой другой ?
Slym (2007-12-13 13:56:00) [33]Сергей М. © (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
XerSon (2007-12-13 13:36:00) [34]
> Сергей М. © (13.12.07 13:29) [19]
Могу выслать на мыло Данный док по преобразованию! Хотя он весь в начале темы!
XerSon (2007-12-13 13:34:00) [35]
> Сергей М. © (13.12.07 13:29) [19]
Это условие Производителя! Только 01! Более ни каких данных на сей момент нет!
Так описано в алгоритме Преобразования!
Сергей М. (2007-12-13 13:29:00) [36]
> 01- Дополнение
Мне это ни о чем не говорит, я знаком с кодом тач-мемори лишь понаслышке.
Почему именно 01, а не какое-либо иное число ?
По каким вообще правилам формируется это самое "дополнение" в мл.байте ?
От этого зависит решение.
XerSon (2007-12-13 13:26:00) [37]
> Сергей М. © (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:14:00) [38]После уточнения в [14] уже не столь.
> 050000000BDAAE 01
Что в дан.случае означает единица в младшем байте кода ?
XerSon (2007-12-13 13:02:00) [39]
> Сергей М. © (13.12.07 13:01) [15]
а это критично?
Сергей М. (2007-12-13 13:01:00) [40]Т.е. 011 - это код помещения, а 55982 - код сотрудника ?