реклама на сайте
подробности

 
 
> crc 8, Нужна помощь
nokepp
сообщение Jan 28 2011, 16:11
Сообщение #1


Участник
*

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



Все добрый день! необходимо написать программу, простенькую, для расчета контрольной суммы по алгоритму crc8.Собственно говоря, я в С++ только только начал разбираться smile3046.gif , но вот появилась такая задача и можно сказать зашился. Хочу, что бы просто в командной строке вводишь данные и сразу выдает ответ. Данные 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 со значением производителя wacko.gif . Я писал им support 1111493779.gif , но они отказываются мне помогать.
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
nokepp
сообщение Jan 31 2011, 10:25
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 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;(прошу прощения за непроффесиональный слэнг)


Go to the top of the page
 
+Quote Post
Artem_Petrik
сообщение Jan 31 2011, 20:10
Сообщение #3


Местный
***

Группа: Свой
Сообщений: 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 (Капитан очевидность biggrin.gif ). Я бы написал так:
Код
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 надо.
Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 7 2011, 15:53
Сообщение #4


Участник
*

Группа: Участник
Сообщений: 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 для ввода пакета данных. или для таких задач необходимо задействовать что-то другое?
Go to the top of the page
 
+Quote Post
Палыч
сообщение Feb 7 2011, 16:01
Сообщение #5


Гуру
******

Группа: Свой
Сообщений: 2 399
Регистрация: 10-05-06
Из: г. Новочеркасск
Пользователь №: 16 954



Цитата(nokepp @ Feb 7 2011, 18:53) *
Но не ясно, где же блит данные=(
Вроде, ясно написано
Цитата
Допустим нужные нам данные, скажем 8 байт, сложены в unsigned char buf[8].
Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 7 2011, 16:03
Сообщение #6


Участник
*

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



Цитата(Палыч @ Feb 7 2011, 19:01) *
Вроде, ясно написано


ах!!!не угледел..но все равно например переменной buf[i] я присваиваю значение в 3 байта...и выскакивают какие-то ошибки. ТОчнее мой компилятор, считает по последнему рабочему коду(
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2011, 16:13
Сообщение #7


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(nokepp @ Feb 7 2011, 18:03) *
переменной buf[i] я присваиваю значение в 3 байта...и выскакивают какие-то ошибки.

Вы часом не так присваиваете:
buf[i] = "333"; <-- вот тут три байта присваиваю, а дурной компилятор ошибку выдает

если так, то советую бросить затею с CRC и почитать для начала какую-нить книжку по C.
Go to the top of the page
 
+Quote Post
nokepp
сообщение Feb 7 2011, 16:20
Сообщение #8


Участник
*

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



Цитата(defunct @ Feb 7 2011, 19:13) *
Вы часом не так присваиваете:
buf[i] = "333"; <-- вот тут три байта присваиваю, а дурной компилятор ошибку выдает


да нет....я примерно понимаю, о чем идет речь. ))) buf[i]= {0x03 0x03 0x03} или в бинарном будет нагляднее видно, что 3 байта.
А кстати какая разница, как записывать. По идее она должна считать до 8 байт или я что-то все же не понял?


Цитата(defunct @ Feb 7 2011, 19:13) *
если так, то советую бросить затею с CRC и почитать для начала какую-нить книжку по C.



Уже читаю Герберт Шилдт)))но понимаете для меня эта задача стоит ребром и ее необходимо решить. Я уже писал, что взялся не по силам, но просто так я не хочу сдаваться.
Go to the top of the page
 
+Quote Post
defunct
сообщение Feb 7 2011, 22:58
Сообщение #9


кекс
******

Группа: Свой
Сообщений: 3 825
Регистрация: 17-12-05
Из: Киев
Пользователь №: 12 326



Цитата(nokepp @ Feb 7 2011, 18:20) *
да нет....я примерно понимаю, о чем идет речь. ))) buf[i]= {0x03 0x03 0x03} или в бинарном будет нагляднее видно, что 3 байта.

при объявлении массива, число в квадратных скобочках задает его размер - т.е. число элементов.
Далее при обращении к этому массиву число в квадратных скобочках обозначает уже не число элементов, а порядковый номер элемента ("И"ндекс потому собсно и обзывают его "i").

Объявляем массив из трех элементов, обычно так:
char buf[ 3 ];

если требуется сразу проинициализировать элементы массива, то пишем сразу при объявлении:
char buf = {10, 20, 30};

после объявления переобъявить его с целью изменения размера - нельзя,
можно только обращаться к его элементам. Любой массив начинается с элемента с номером 0.
Для объявленного и проинициализированного выше массива из 3-х элементов

buf[0] <--- элемент с номером 0, равен 10
buf[1] <--- элемент с номером 1, равен 20
buf[2] <--- элемент с номером 2, равен 30

buf[i] - это элемент массива buf с номером i

пример заполнить массив из 8-ми элементов числами 0, 1, 2, 3, 4, 5, 6, 7:

Код
char buf[ 8 ]; // объявить массив из 8-ми элементов
char i;

for(i = 0; i < 8; i++)
{
     buf[ i ] = i; // присвоить i-му элементу массива число i
}



Цитата
А кстати какая разница, как записывать. По идее она должна считать до 8 байт или я что-то все же не понял?

Большая - при расчете CRC количество символов тоже важно.
В примере который вам дали считается CRC для сообщения из строго 8 байт. И даже если массив у вас из 3-х элементов, там все равно CRC посчитается для 8-ми.

Цитата
Уже читаю Герберт Шилдт

Книга хорошая, прочитайте ее всю бегло - множество вопросов должно отпасть.
Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- 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 @ Feb 7 2011, 19:20) buf[i]...   Feb 7 2011, 16:26
|- - 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


Reply to this topicStart new topic
2 чел. читают эту тему (гостей: 2, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 14:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01488 секунд с 7
ELECTRONIX ©2004-2016