|
crc 8, Нужна помощь |
|
|
|
Jan 28 2011, 16:11
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Все добрый день! необходимо написать программу, простенькую, для расчета контрольной суммы по алгоритму crc8.Собственно говоря, я в С++ только только начал разбираться  , но вот появилась такая задача и можно сказать зашился. Хочу, что бы просто в командной строке вводишь данные и сразу выдает ответ. Данные hex. Алгоритм программы таков public class CRC8 { private static int getCrc(int oneByte, int crc){ int i = oneByte ^ crc; crc = 0; if((i & 0x01)>0) crc ^= 0x5e; if((i & 0x02)>0) crc ^= 0xbc; if((i & 0x04)>0) crc ^= 0x61; if((i & 0x08)>0) crc ^= 0xc2; if((i & 0x10)>0) crc ^= 0x9d; if((i & 0x20)>0) crc ^= 0x23; if((i & 0x40)>0) crc ^= 0x46; if((i & 0x80)>0) crc ^= 0x8c; return crc; } byte[] bytes = {(byte)0x31,(byte)0xFF,(byte)0x06}; System.out.printf("crc=%X\n",CRC8.getCrc4Array(bytes)); Сразу скажу, что возможно он отличается от привычных всем, ибо этот алгоритм разработан производителями переферийнного устройства и, подсчитывая crc в ручную, у меня не совпадало значение моего crc со значением производителя  . Я писал им support  , но они отказываются мне помогать.
|
|
|
|
|
 |
Ответов
|
Jan 31 2011, 10:25
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
В общем вот что у меня получилось:
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <iostream>
unsigned char crc8(unsigned char data, unsigned int crc) { unsigned char i=data^crc; crc=0; if(i & 0x01) crc^=0x5e; if(i & 0x02) crc^=0xbc; if(i & 0x04) crc^=0x61; if(i & 0x08) crc^=0xc2; if(i & 0x10) crc^=0x9d; if(i & 0x20) crc^=0x23; if(i & 0x40) crc^=0x46; if(i & 0x80) crc^=0x8c; return crc; }
void main (void) { unsigned char a,c=0x00,l=1; a=crc8(c,l); printf("a=0x%x",a); getch(); }
В данном примере считает для 0x01.(т.е. l=0x01). Но проблема в том, что считает для значений только до 9. ВСе что выше(10,11,...), выдает уже неверные значения.Мне нужно расширить значение до максимума. Ну например "31FF09". Пока не врублюсь как это сделать.. И еще интересует как сделать чтобы значение можно было вводить в окно консоля...пробовал через using namespace std;но короче он ругается на unsigned char;(прошу прощения за непроффесиональный слэнг)
|
|
|
|
|
Jan 31 2011, 20:10
|
Местный
  
Группа: Свой
Сообщений: 443
Регистрация: 22-07-06
Из: Украина, г. Харьков
Пользователь №: 19 006

|
Цитата(nokepp @ Jan 31 2011, 12:25)  ... unsigned char crc8(unsigned char data, unsigned int crc) { ... }
void main (void) { unsigned char a,c=0x00,l=1; a=crc8(c,l); printf("a=0x%x",a); getch(); } Насколько я вижу, при вызове функции перепутаны местами данные и crc. Понятнее было бы переменную для crc назвать crc (Капитан очевидность  ). Я бы написал так: Код unsigned char crc; unsigned char data = 1; // ну это чтоб от вас не отличаться сильно
crc = crc8(data, crc); printf("crc=0x%x",crc); Цитата Ну например "31FF09". Пока не врублюсь как это сделать. Приведенное вами значение это 3 байта. Ваша же функция считает crcдля одного байта. Когда нужно посчитать crc для пакета в несколько байт делают так: Допустим нужные нам данные, скажем 8 байт, сложены в unsigned char buf[8]. тогда Код unsigned char crc = 0; // Начальное значение. В общем случае может быть и не 0, надо смотреть спецификацию. for(i=0;i<8;i++) crc = crc8(buf[i], crc); printf("crc пакета =0x%x",crc); P.S. ну и зачем при обьявлении функции crc сделан unsigned int тоже непонятно. unsigned char надо.
|
|
|
|
|
Feb 7 2011, 15:53
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Цитата(Artem_Petrik @ Jan 31 2011, 23:10)  Приведенное вами значение это 3 байта. Ваша же функция считает crcдля одного байта. Когда нужно посчитать crc для пакета в несколько байт делают так: Допустим нужные нам данные, скажем 8 байт, сложены в unsigned char buf[8]. тогда Код unsigned char crc = 0; // Начальное значение. В общем случае может быть и не 0, надо смотреть спецификацию. for(i=0;i<8;i++) crc = crc8(buf[i], crc); printf("crc пакета =0x%x",crc); P.S. ну и зачем при обьявлении функции crc сделан unsigned int тоже непонятно. unsigned char надо. Что-то у меня с данными размеров выше одного байта ничего не получается. Еще компилятор такой дурацкий. Как я понял buf[i] это массив ... i-кол-во байт данных. значит включается счетчик от одного до 8 байт и с каждым прибавлением 1 ,выполняется присваивание. Но не ясно, где же блит данные=( и еще не ясно, как же задействовать команду cin для ввода пакета данных. или для таких задач необходимо задействовать что-то другое?
|
|
|
|
|
Feb 7 2011, 16:03
|
Участник

Группа: Участник
Сообщений: 27
Регистрация: 24-11-10
Пользователь №: 61 153

|
Цитата(Палыч @ Feb 7 2011, 19:01)  Вроде, ясно написано ах!!!не угледел..но все равно например переменной buf[i] я присваиваю значение в 3 байта...и выскакивают какие-то ошибки. ТОчнее мой компилятор, считает по последнему рабочему коду(
|
|
|
|
Сообщений в этой теме
nokepp crc 8 Jan 28 2011, 16:11 Сергей Борщ QUOTE (nokepp @ Jan 28 2011, 18:11) и, по... Jan 28 2011, 16:44 zltigo QUOTE (nokepp @ Jan 28 2011, 19:11) Сразу... Jan 28 2011, 19:23 XVR Так, мимоходом -
ЦитатаСобственно говоря, я в С++ ... Jan 31 2011, 09:28      nokepp Цитата(defunct @ Feb 7 2011, 19:13) Вы ча... Feb 7 2011, 16:20       Палыч Цитата(nokepp @ Feb 7 2011, 19:20) buf[i]... Feb 7 2011, 16:26       defunct Цитата(nokepp @ Feb 7 2011, 18:20) да нет... Feb 7 2011, 22:58   Artem_Petrik Цитата(nokepp @ Feb 7 2011, 17:53) Как я ... Feb 7 2011, 16:04 DpInRock Я бы на вашем месте попытался бы разобраться что т... Jan 31 2011, 14:36 nokepp Цитата(DpInRock @ Jan 31 2011, 17:36) Я б... Jan 31 2011, 15:48  Палыч Цитата(nokepp @ Jan 31 2011, 18:48) ... и... Jan 31 2011, 16:18  Dnepr33 Цитата(nokepp @ Jan 31 2011, 17:48) Сомне... Feb 1 2011, 17:23 ViKo Мне попадался полином x^8 + x^2 + x + 1 (CRC-8-Dal... Feb 1 2011, 09:21 nokepp ну да...данные вбиваются с клавиатуры. Так точнее ... Feb 7 2011, 16:08 Artem_Petrik Цитата(nokepp @ Feb 7 2011, 18:08) ну да.... Feb 7 2011, 16:15  Dnepr33 Цитата(Artem_Petrik @ Feb 7 2011, 18:15) ... Feb 7 2011, 17:15 nokepp Вроде подразобрался, но все равно возникают трудно... Feb 10 2011, 15:41 Палыч Цитата(nokepp @ Feb 10 2011, 18:41) но по... Feb 10 2011, 15:47 Artem_Petrik надо не Кодfor(i=0;i++;i<8) а Кодfor... Feb 10 2011, 17:18 nokepp Всем спасибо огромное за терпение и помощь. Програ... Feb 11 2011, 09:49
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|