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

 
 
> 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
Ответов
zltigo
сообщение Jan 28 2011, 19:23
Сообщение #2


Гуру
******

Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244



QUOTE (nokepp @ Jan 28 2011, 19:11) *
Сразу скажу, что возможно он отличается от привычных всем, ибо этот алгоритм разработан производителями переферийнного устройства и, подсчитывая crc в ручную

О! Это совершенно секретный sm.gif, как уже заметил Сергей полином X^8+X^5+X^4+X^0 имении Dallas. Считается оптимальным для коротких последовательностей. Считается, как и любой CRC массой способов. Хоть по таблице:
CODE
const BYTE crc8_8540_tbl[]=
{
  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
};


хоть другими отличными от Вашего софтовыми способами:
CODE
#define CRC8INIT    0x00
#define CRC8POLY    0x18              //    X^8+X^5+X^4+X^0
              //    0x18 = ( 0x130 >> 1 ) & 0x7F
bint crc8_8540( BYTE *data_in, bint bytes )
{
BYTE crc = CRC8INIT;
bint bit_cnt;
register BYTE data;
register BYTE feedback_bit;

    while( bytes-- )
    {   data = *data_in++;

        for( bit_cnt=8; bit_cnt; bit_cnt-- )
        {
            feedback_bit = (data^crc) & 0x01;
            crc  >>= 1;
            data >>= 1;
            if( feedback_bit )
                crc ^= ((CRC8POLY >> 1)|0x80);
        }
    }
    return( crc );
}



хоть в железе:
CODE
//---------------------------------------------------------------------------
// Verilog module containing a synthesizable Dallas CRC8 function
//   * Polynomial: (8 5 4 0)
//   * Data width: 8
//   * CRC width : 8
//   * Mirror
//---------------------------------------------------------------------------
module CRC8_8540;

  function [7:0] nextCRC;

    input [7:0] Data;
    input [7:0] CRC;

    reg [7:0] D;
    reg [7:0] C;
    reg [7:0] xCRC;


      begin

    D = Data;
    C = CRC;

    // Mirror DATA and final CRC
    xCRC[7] = D[1]^D[3]^D[4]^D[7]^C[7]^C[4]^C[3]^C[1];
    xCRC[6] = D[0]^D[2]^D[3]^D[6]^C[6]^C[3]^C[2]^C[0];
    xCRC[5] = D[1]^D[2]^D[5]^C[5]^C[2]^C[1];
    xCRC[4] = D[0]^D[1]^D[4]^C[4]^C[1]^C[0];
    xCRC[3] = D[0]^D[1]^D[4]^D[7]^C[7]^C[4]^C[1]^C[0];
    xCRC[2] = D[0]^D[1]^D[4]^D[6]^D[7]^C[7]^C[6]^C[4]^C[1]^C[0];
    xCRC[1] = D[0]^D[3]^D[5]^D[6]^C[6]^C[5]^C[3]^C[0];
    xCRC[0] = D[2]^D[4]^D[5]^C[5]^C[4]^C[2];

    nextCRC = xCRC;

      end

  endfunction

endmodule


Судя по режущим глаз if((i & 0x01)>0) напахать Вы могли в Вашей первой программе где угодно, а не в отцитированных Вами кусочках.


--------------------
Feci, quod potui, faciant meliora potentes
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
- - XVR   Так, мимоходом - ЦитатаСобственно говоря, я в С++ ...   Jan 31 2011, 09:28
- - nokepp   В общем вот что у меня получилось: #include <c...   Jan 31 2011, 10:25
|- - Artem_Petrik   Цитата(nokepp @ Jan 31 2011, 12:25) ... u...   Jan 31 2011, 20:10
|- - nokepp   Цитата(Artem_Petrik @ Jan 31 2011, 23:10)...   Feb 7 2011, 15:53
|- - Палыч   Цитата(nokepp @ Feb 7 2011, 18:53) Но не ...   Feb 7 2011, 16:01
||- - nokepp   Цитата(Палыч @ Feb 7 2011, 19:01) Вроде, ...   Feb 7 2011, 16:03
||- - defunct   Цитата(nokepp @ Feb 7 2011, 18:03) переме...   Feb 7 2011, 16:13
||- - 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


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

 


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


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