Страница: 1 | 2 |
Вопрос: Помогите с CRC-8(16)!!! Совсем я замучался...
Добавлено: 26.01.05 14:36
Автор вопроса: Stn
Все, что я пробовал из готового и писал сам, считает CRC-8 не верно!
У кого есть рабочий пример подсчета контр. суммы и передачи ее в конец сообщения или куда либо еще. Поделитесь плз.!!!
Язык написания не важен, но на асме было бы вообще супер!
Заранее всем спасибо, огромное!
п.с. На форуме все поглядел, попробовал - не помогло! :о(
Ответы
Всего ответов: 26
Номер ответа: 1
Автор ответа:
VisBas
Вопросов: 44
Ответов: 127
Web-сайт:
Профиль | | #1
Добавлено: 26.01.05 20:29
Вот алгоритм на С
char CRC8(char data)
{
char n;
count=8;
do { n=1 & (data^CRC);
CRC>>=1; data>>=1;
if(n) CRC^=0x8C;
} while(--count);
return CRC;
}
Вот другой пример тоже на С
char CRC( char * code )
{
char A = 0 , ACC , carry = 0 , crc = 0;
char i, j ;
for( i = 0 ; i < 7 ; i ++ )
{
ACC = code [ i ] ;
A = ACC ;
for( j = 0 ; j < 8 ; j ++ )
{
A ^= crc ;
rrc ( & A , & carry ) ;
if( ( ACC ^ crc ) & 0x1 )
crc ^= 0x18 ;
rrc( & crc , & carry ) ;
ACC >>= 1 ;
A = ACC ;
}
}
пример использования:
CRC=0
CRC=CRC8(x1);
CRC=CRC8(x2);
в CRC искомая контрольная сумма
Вот третий пример тоже на С
char CRC = 0;
void UpdateCRC (char b)
{
char i;
for (i = 8; i > 0; i--)
{
if ((b ^ CRC) & 1) CRC = ((CRC ^ 0x18) >> 1) | 0x80;
else CRC >>= 1;
b >>= 1;
};
Если реализуеш на VB в качестве модуля, пожалуйста скинь на raspad1@yandex.ru , если не жалко.
Мне тоже пригодиться.
Номер ответа: 2
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #2
Добавлено: 26.01.05 20:58
тебе именно crc8 нужен? Есть crc32 для файлов, можно доделать её и для строк
Номер ответа: 3
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #3
Добавлено: 27.01.05 13:31
Cresta, да, именно 8ой или на худой конец 16тый и именно для сттрок.
VisBas, спасибо большое. Все варианты мне знакомы (накачал из сетки более 30ти метров разных алгоритмов, смотрел, пытался понять...). Проблемка в том, что не могу я догнать как все это на Си работает :о(. Знаю что можно компилировать с асм-листингом, но Си у меня нету, и компилятора нету и комманд компилятора (для получения листинга) я не знаю...
Такие дела :о(
А вообще, спасибо конечно, ребята, что откликнулись!!!
Номер ответа: 4
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #4
Добавлено: 27.01.05 15:30
Жаль, что на Сях тут приведен алгоритм
Сходи сюда:
http://www.wasm.ru/forum/index.php?action=vthread&forum=21&topic=8457&page=0
может это то, что тебе надо?
А чем отличается crc8 от crc32 ? Ну кроме самой таблицы, начального значения, последнего xor'a ?
Алгоритм тот же или нет?
Номер ответа: 5
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #5
Добавлено: 28.01.05 12:20
Cresta, это мой топик :о))) (сильно видно я нашумел...)
а дока по crc тут: http://www.wasm.ru/docs/5/crc.zip (не ахти, но все-же. Если будет интересно, у меня полно всего по теме)
Вообще реализаций crc масса и у всех свои "заморочки".
Относительно crc8 я вообще думал всегда, что это елементарное суммирование байтов :о))
типа: 12+14+11=контр.сумма=37
теперь отправляем получателю пакет--> 12 14 11 + 37(наша crc). Получатель делает все по аналогии и отвечает - Зашибись! (ок)
На самом деле вроде все совсем не так :о((
Номер ответа: 6
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #6
Добавлено: 28.01.05 13:34
А почему именно 8? Те же сам пишешь программу, можно ведь и 16 и 32 применить, более того для 32 гораздо меньше возможности случайного совпадения.
Ну в общем, есть на asm'e 32 для файлов и строк (в т.ч. Unicode). Прототип был какой-то класс на VB. Если надо будет, кричи.
Номер ответа: 7
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #7
Добавлено: 28.01.05 15:25
Cresta, кричу - Спасибо! :о)
программу я действительно пишу, но под конкретный девайс, а именно, телефон SKY-6100 (CDMA-2000 (800Mhz)). Сделали это чудо корейские "гении" и там помимо всяких гиморов с хардваром, еще и при соединении считается crc8 или 16 и комманды свои для управления аппаратом. Другие не катят, я уже попробовал 32ой - не прокатил :о(, а те 16тые, которые у меня работают сейчас, дают неверный crc.
Вот что могу сказать, точнее попросить...
Есть строка 1(для передачи в порт): "AT*SKT*PING" (её представление в hex (как показывает некая программка, portmon): "41 54 2A 53 4B 54 2A 50 49 4E 47"
плюс добавляем преславутый crc "09 03" и пихаем в порт.
Еще есть строка 2(для передачи в порт): "1234567890" (её представление в hex (как показывает некая программка, portmon): "31 32 33 34 35 36 37 38 39 30" плюс еще один crc "0D 02" и тоже все в порт...
В ответ девайс кинет в порт следующее: "..*SKT*PONG: 0, 20050128150004....OK..".
Если у тебя совпадет когда-нибудь crc строк с тем, что я указал, тогда уж ты кричи... и погромчее :о)) Буду очень благодарен!
Всех благ!
Номер ответа: 8
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #8
Добавлено: 28.01.05 18:26
Судя по тому, что телефон, и что корейцы делали, имею предположение, причем оно может радикально влияет на проблему: UNICODE.
Одна и та же фраза в UNICODE и в ANSI будет иметь совершенно разные crc (даже подсчитанные одним алгоритмом).
Кроме того, любой алгоритм, производящий какие-либо вычисления с байтами строки, уже можно записать в crc-алгоритм. Стандартных (получивших распространение) алгоритмов - множество. Какой из них использует телефон - это только искать в самом телефоне процедуру подсчета и реализовывать её в своей программе. И при этом пробовать оба варианта строки: Unicode и Ansi. Вполне возможно, что ты уже пробовал нужный алгоритм, но из-за несовпадения кодировок прошел мимо нужного, не заметив его.
Номер ответа: 9
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #9
Добавлено: 28.01.05 19:33
Cresta, а ведь ты мозг! Еще какой мозг... Т.е. я хочу сказать, что "слона то я и не заметил...." :о))
Буду пробовать, а о результатах отпишусь после выходных.
К стати, есть еще одно наблюдение... может оно выльется в вариант решения проблемки с crc8, но об этом тоже в понедельник!
Хороших выходных!
Номер ответа: 10
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #10
Добавлено: 30.01.05 08:17
На ассемблере:
; si=pointer to array,cx=array size; -> ah=CrC
CalcCrc proc near
push si
mov ax,0
mov bx, offset LookUpCrc
cld
Ccrc_next: lodsb
xor al,ah
xlat
mov ah,al
loop Ccrc_next
pop si
ret
CalcCrc endp
LookUpCrc db 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32,
163, 253, 31, 65
db 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189,
62, 96, 130, 220
db 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3,
128, 222, 60, 98
db 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158,
29, 67, 161, 255
db 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102,
229, 187, 89, 7
db 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251,
120, 38, 196, 154
db 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69,
198, 152, 122, 36
db 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216,
91, 5, 231, 185
db 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172,
47, 113, 147, 205
db 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49,
178, 236, 14, 80
db 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143,
12, 82, 176, 238
db 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18,
145, 207, 45, 115
db 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234,
105, 55, 213, 139
db 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119,
244, 170, 72, 22
db 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201,
74, 20, 246, 168
db 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84,
215, 137, 107, 53
Номер ответа: 11
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #11
Добавлено: 30.01.05 14:09
h**p://www.Planet-Source-Code.com/vb/scripts/ShowCode.asp?txtCodeId=38122&lngWId=1
тут 32ой на vb есть. кому надо то было...?
Sharp, спасибо!
есть у меня эта реализация, только что-то не пашет она... :о((
Номер ответа: 12
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #12
Добавлено: 30.01.05 16:11
А что выдает?
Номер ответа: 13
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #13
Добавлено: 31.01.05 13:25
"mov bx, offset LookUpCrc " - таблицу в регистр загрузить нельзя, ругается - "instruction operands must be the same size"
Номер ответа: 14
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #14
Добавлено: 31.01.05 15:53
А, ну это типа под DOS код, я думал, что под Винду ты и сам переведешь... Конечно, они разных размеров, ведь в Win32 оффсет (т.е. адрес) 32-битный, а в DOS память сегментирована.
Номер ответа: 15
Автор ответа:
Stn
Вопросов: 1
Ответов: 14
Профиль | | #15
Добавлено: 31.01.05 17:29
Вот что под винду:
CRC16Proc proc msg:DWORD,len:DWORD
mov esi,[msg] строку сюда...
l_char:
lodsb
mov dl,al
mov ax,[CrcIn] 0ffffh
mov ecx,8
l_crc:
rcl dl,1
rcl ax,1
jnc no_xor
xor ax,[crc_poly] полином (1021h)
no_xor:
loop l_crc
mov [CrcIn],ax
mov eax,[len]
dec eax
mov [len],eax
jnz l_char
mov ecx,16
mov ax,[CrcIn];[crc_poly]
l_argument:
shl ax,1
jnc no_xor1
xor ax,[crc_poly];[poly]
no_xor1:
loop l_argument
mov CrcIn,ax
ret
; char *msg="123456789"
; crc=CRC(msg,9)
; printf("%04x\n",crc); 0xe5cc - должон быть такой CRC
;----------------
CRC16Proc endp
но crc у мя неверный... :о(