Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: Помогите с CRC-8(16)!!! Совсем я замучался... Добавлено: 26.01.05 14:36  

Автор вопроса:  Stn
Все, что я пробовал из готового и писал сам, считает CRC-8 не верно!

У кого есть рабочий пример подсчета контр. суммы и передачи ее в конец сообщения или куда либо еще. Поделитесь плз.!!!
Язык написания не важен, но на асме было бы вообще супер!

Заранее всем спасибо, огромное!

п.с. На форуме все поглядел, попробовал - не помогло! :о(

Ответить

  Ответы Всего ответов: 26  

Номер ответа: 1
Автор ответа:
 VisBas



Вопросов: 44
Ответов: 127
 Web-сайт: chipmicro.narod.ru
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #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 у мя неверный... :о(

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам