Помогите разобраться с кодом где ошибка

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012
#define rxd 3 // rx data pin
#define rxe 4 // rx enable pin
#define delta 100 // max time delta
#define mintime 100 // min time pulse
unsigned int time,oldtime,count,log0,log1; //
byte data[8]; //
void setup(){
pinMode(rxd,INPUT); //
pinMode(rxe,OUTPUT); //
digitalWrite(rxe,LOW); //
attachInterrupt(rxd,pinint,CHANGE); //
Serial.begin(115200); //
Serial.println("Starline 64 bit receiver started");//
interrupts(); //
}
void pinint(){
if(digitalRead(rxd)==HIGH)oldtime=micros(); //
else{
time=micros()-oldtime; //
if(time<mintime)return; //
if(constrain(time,log0-delta,log0+delta)==time)savebit(false); //
else if(constrain(time,log1-delta,log1+delta)==time)savebit(true); //
else{
log0=time/2; //
log1=time/4; //
count=0; //
}
}
}
void savebit(boolean val){
for(int i=1;i<=8;i++){ //
data[i]=data[i]<<1; //
if(i<8)if(bitRead(data[i+1],7))bitSet(data[i],0); //
}
if(val)bitSet(data[8],0); //
count++; //
if(count==64){ //
Serial.print("STARLINE "); //
for(int i=1;i<=8;i++)printhex(data[i]); //
Serial.println(""); //
}
}
void printhex(byte val){ //
if(val<=0x0F)Serial.print("0"); //
Serial.print(val,HEX); //
}
void loop(){} 

 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Данные не выводятся в терминал не пойму почему, есле что сильно не ругать навичек... 

mitos
Offline
Зарегистрирован: 11.12.2011

а скорость в терминале такая же как в скетче ?  

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Да 

step962
Offline
Зарегистрирован: 23.05.2011

 А строка приветствия ("Starline 64 bit receiver started") выводится?

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

В радной терминалке эроглефы!!! А в другой только приветсвия и выводится...

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

В коде гдето ошибка так как принемаеммые данные не выводятся в терминал!!!! А где именно ошибка понять не могу. 

step962
Offline
Зарегистрирован: 23.05.2011

Phreaker Chernie пишет:

В радной терминалке эроглефы!!! А в другой только приветсвия и выводится...

Прежде чем искать ошибку в алгоритме, устраните вывод "'эроглефов в радной терминалке"? Ненормально выводимое приветствие говорит о том, что вы канал связи криво настроили.

Как минимум.

step962
Offline
Зарегистрирован: 23.05.2011

Кстати, что за значение вы пытаетесь сохранить в переменной time?

Для чего нужны переменные log0 и log1?

Чего ради вы пишете за границы массива (строка 35) и иногда читаете за границами массива (строка 33)?

Диапазон частот принимаемого на пин rxd сигнала?

Еще очень много вопросов можно было бы поставить, если бы алгоритм был известен хотя бы в общих чертах. А гадать на кофейной гуще - нет уж, увольте...

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ресивер стоит 433.92 Мгц частота в основном используется во всех авто сигнализациях...

Данные идут вот в этой кодеровке - KeeLoq (является блочным кодом с 64-разрядным ключом и размером блока 32 бита.) 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ошибку в родном терменале устранил... Приветствия выводится отлично но код не в коком виде 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Уважаемый step962 делал по этому примеру есле что не принимайте в серьез маи ошибки я новичек вот код ниже ... Код под ATmegu 16

//------------------------------------
// (c) Stainless Steel Rats Club'2010
// http://steelrats.net/
//------------------------------------

//#define F_CPU=8000000UL

#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <stdlib.h>
#include <stdio.h>

#include "keeloq.h"
#include "starline.h"

#define TIMER_DIV 32 //us
#define RAW
#define DECODE

#define RX_PORT PORTD
#define RX_DDR DDRD
#define RX_PIN PIND
#define RX PD2
#define RX_STATE (RX_PIN&(1<<RX))

int uart_putchar(char c, FILE *stream);
FILE uart_str=FDEV_SETUP_STREAM(uart_putchar, NULL, _FDEV_SETUP_WRITE);

char s_hello[] PROGMEM = "\n### KeeLoq&StarLine Logger ###\n\n";
char s_keeloq[] PROGMEM = "KeeLoq";
char s_starline[] PROGMEM = "StarLine";

volatile struct
{
  unsigned char state;
  unsigned char TE, pre_count, data[9], dat_bit;
} keeloq;

volatile struct
{
  unsigned char state;
  unsigned char pre_count, data[8], dat_bit;
} starline;

int uart_putchar(char c, FILE *stream)
{
  if(c=='\n') uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR=c;

  return 0;
}

#define KL_MIN_PRE_COUNT 4
#define KL_MAX_TE (800/TIMER_DIV)
#define KL_MIN_TE (200/TIMER_DIV)
#define KL_MAX_BITS 66

void process_keeloq(unsigned char p_len)
{
  unsigned char a;

  switch(keeloq.state)
  {
    case 0:
      if(!RX_STATE) break;
      keeloq.state=1;
      keeloq.pre_count=0;
      break;

    case 1: //pre+hdr
      if(RX_STATE)
       if(p_len>KL_MAX_TE*10 || p_len<KL_MIN_TE)
       {
         keeloq.state=0;
         break;
       }

      if(!RX_STATE)
       if(p_len>KL_MAX_TE || p_len<KL_MIN_TE)
       {
         keeloq.state=0;
         break;
       }

      if(RX_STATE && p_len>KL_MAX_TE)
      {
        if(keeloq.pre_count<KL_MIN_PRE_COUNT)
        {
          keeloq.state=0;
          break;
        }

        keeloq.TE=(p_len)/10;
        keeloq.state=2;
        keeloq.dat_bit=0;
        for(a=0; a<sizeof(keeloq.data); a++) keeloq.data[a]=0;
        break;
      }

      keeloq.pre_count++;
      break;

    case 2: //dat
      if(p_len<keeloq.TE/2 || p_len>keeloq.TE*2+keeloq.TE/2)
      {
        keeloq.state=0;
        break;
      }

      if(RX_STATE) break;

      if(p_len<keeloq.TE+keeloq.TE/2) keeloq.data[keeloq.dat_bit/8]|=(1<<(keeloq.dat_bit%8));

      if(++keeloq.dat_bit==KL_MAX_BITS) keeloq.state=3;
      break;

    case 3:
      break;
  }
}

#define SL_MIN_PRE_COUNT 4
#define SL_MAX_PRE (1200/TIMER_DIV)
#define SL_MIN_PRE (850/TIMER_DIV)
#define SL_MAX_ONE (416/TIMER_DIV)
#define SL_MIN_ONE (150/TIMER_DIV)
#define SL_MAX_ZERO (650/TIMER_DIV)
#define SL_MIN_ZERO (416/TIMER_DIV)
#define SL_MIN_BITS 16
#define SL_MAX_BITS 64

void process_starline(unsigned char p_len)
{
  unsigned char a, b;

  _begin:

  switch(starline.state)
  {
    case 0:
      if(!RX_STATE) break;
      starline.state=1;
      starline.pre_count=0;
      break;

    case 1: //pre
      if(p_len>SL_MAX_PRE)
      {
        starline.state=0;
        break;
      }

      if(p_len<SL_MIN_PRE && starline.pre_count>=SL_MIN_PRE_COUNT)
      {
        starline.state=2;
        starline.dat_bit=0;
        for(a=0; a<sizeof(starline.data); a++) starline.data[a]=0;
        goto _begin;
      }

      starline.pre_count++;
      break;

    case 2: //dat
      if(p_len>=SL_MIN_ONE && p_len<=SL_MAX_ONE) b=1;
      else if(p_len>=SL_MIN_ZERO && p_len<=SL_MAX_ZERO) b=0;
      else if(starline.dat_bit>=SL_MIN_BITS)
      {
        starline.state=3;
        break;
      }
      else
      {
        starline.state=0;
        break;
      }

      if(!RX_STATE)
      {
        if(b) starline.data[starline.dat_bit/8]|=(1<<(starline.dat_bit%8));
        if(++starline.dat_bit==SL_MAX_BITS) starline.state=3;
      }
      break;

    case 3:
      break;
  }
}

#define FILTER 20
#define FILTER_STEP 5
#define MAX_PULSE (6000/TIMER_DIV) //6ms
#define MIN_PULSE (64/TIMER_DIV) //64us

ISR(INT0_vect)
{
  unsigned char len;

  len=TCNT0;
  if(len<MIN_PULSE) return;
  TCNT0=0;

  if(len>MAX_PULSE)
  {
    keeloq.state=0;
    starline.state=0;
  }

  process_keeloq(len);
  process_starline(len);
}

void dump_hex(volatile unsigned char *data, unsigned char bits)
{
  unsigned char a;

  for(a=bits/8+((bits%8)?1:0); a>0; a--) printf("%.2X ", data[a-1]);
}

int main(void)
{
  //31.250KHz
  TCCR0=(1<<CS02)|(0<<CS01)|(0<<CS00);
  TCNT0=0;
  OCR0=0;

  GICR=(1<<INT0);
  MCUCR=(0<<ISC01)|(1<<ISC00);
  MCUCSR=0;
  GIFR=(1<<INTF0);

  TIMSK=0;

  //115200, double speed
  UCSRA=0x02;
  UCSRB=0x08;
  UCSRC=0x86;
  UBRRH=0x00;
  UBRRL=0x08;

  stdout=&uart_str;

  printf("%S", s_hello);

  sei();

  while(1)
  {
    if(keeloq.state==3)
    {
      printf("%S [TE=%.3d pre_cnt=%.2d] ", s_keeloq, keeloq.TE*TIMER_DIV, keeloq.pre_count);
#ifdef RAW
      dump_hex(keeloq.data, sizeof(keeloq.data)*8);
      printf("\n");
#endif
#ifdef DECODE
      printf("hop:%.8lX serial:%.7lX fun:%.1X bat:%d fix:%d\n\n",
             ((keeloq66_packet*)keeloq.data)->hop,
             ((keeloq66_packet*)keeloq.data)->serial,
             ((keeloq66_packet*)keeloq.data)->function,
             ((keeloq66_packet*)keeloq.data)->flag_bat,
             ((keeloq66_packet*)keeloq.data)->flag_rep);
#endif

      keeloq.state=0;
    }

    if(starline.state==3)
    {
      printf("%S [%.2d] ", s_starline, starline.dat_bit);
#ifdef RAW
      dump_hex(starline.data, starline.dat_bit);
      printf("\n");
#endif
#ifdef DECODE
      if(starline.dat_bit==64)
        printf("hop:%.8lX serial:%.6lX fun:%.2X\n\n",
               ((starline64_packet*)starline.data)->hop,
               ((starline64_packet*)starline.data)->serial,
               ((starline64_packet*)starline.data)->function);
#endif

      starline.state=0;
    }
  }

  return 0;
}

 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Уважаемый step962 где вы увидели выход за границе; границы массива 0-8, используется 1-8, выхода за границы нет...

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Вот оналогичный код... Нашел в интернети ну тож не понятно...

void CheckStarline(unsigned int low, unsigned int high, boolean state)
{
  static int starline1 = 0;        // level 1
  static int starline0 = 0;        // level 0
  static byte starlineCounter = 0;  // count of bits stored
  static long StarLineCode1 = 0;    // first part
  static long StarLineCode2 = 0;    // last part

  boolean bValidPacket=false;

  if (state==HIGH)
    return; // ignore switch from low to HIGH

  if (CheckValue(starline0, high, 100))                 // valid 0
  {
    StarLineCode1=(StarLineCode1<<1)|0;      // save 0
    bValidPacket = true;
  }
  else if (CheckValue(starline1, high, 100))            // valid 1
  {
    StarLineCode1=(StarLineCode1<<1)|1;      // save 1
    bValidPacket = true;
  }

  if (bValidPacket)  // we have valid bit
  {
    starlineCounter++;

    if (starlineCounter==32)  // save first dword
      StarLineCode2=StarLineCode1;

    if (starlineCounter==64)  // yohoho, we finish receiving
      SaveCode(CODE_TYPE_STARLINE, StarLineCode2, StarLineCode1);    // save code somewhere
  }
  else
  {
    starline1=high>>1;     // 1 == half of preambula, should be 500 us for casual starline
    starline0=starline1>>1;     // 0 == half of 1, should be 250 us for casual starline
    starlineCounter=0;          // and nothing received
  }
}

Надеюсь ктонибудь сможет помочь!!!!

 

step962
Offline
Зарегистрирован: 23.05.2011

Phreaker Chernie пишет:

Уважаемый step962 где вы увидели выход за границе; границы массива 0-8, используется 1-8, выхода за границы нет...

Если вы объявляете массив как

int arr[8];

то резервируете область памяти под 8 (восемь) переменных типа int, обращение к которым происходит с помощью индекса, изменяющегося в пределах 0...7. При обращении к массиву с помощью индекса 8, вы, по сути, пытаетесь работать с ДЕВЯТЫМ элементом массива, место под который, естественно не зарезервировано. При этом читается (записывается) из области памяти, следующей сразу за массивом. Что там находится - дело случая. Что из этого может получиться - трудно предсказать. В любом случае, такие действия не могут идти на пользу программе.

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

А вот теперь понял спасибо за очень подробное разЪеснение.... step962

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Уважаемый step962 есле вас не затруднит не моглибы полностью разжувать мне мою программу... И помочь с описанием кождой строчки может всетока получится найти ошибку... За рание огромное спасибо!!!

step962
Offline
Зарегистрирован: 23.05.2011

Phreaker Chernie пишет:

Уважаемый step962 есле вас не затруднит не моглибы полностью разжувать мне мою программу... 

Конечно же затруднит - я представления не имею, для чего нужны эти коды, какая информация поступает на вход, что должно получиться на выходе и т.д. и т.п. Я до сих пор понятия не имею, будет ли интересна мне эта задача (скорее всего - нет).

Вам необходимо искать человека, которому будет интересна тема - и заниматься правкой данного кода (или разработкой нового) вместе. А для того, чтобы найти такого человека, необходимо хотя бы как можно точнее обрисовать задачу. Еще лучше - обрисовать эту задачу как можно увлекательнее. В противном случае вы едва ли найдете человека, готового убить несколько вечеров на непонятно что. Я точно не в их числе.

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Всем ограммное спасибо кто участвовал!!! С кодом разобрался самостоятельно там была маленкая ошибочка...

Как говарится... Есле долго мучится, Чтонибудь получится.... 

whoim
Offline
Зарегистрирован: 03.11.2011

 

))))

step962
Offline
Зарегистрирован: 23.05.2011

Phreaker Chernie пишет:

Всем ограммное спасибо кто участвовал!!! С кодом разобрался самостоятельно там была маленкая ошибочка...

Ну не томите - скажите, какую "маленькую ошибочку" нашли? Может быть, тогда и на более серъезные укажем. ;)

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Вот рабачий код...

/*

*/
// (c) 2012 Phreaker Chernie
#define rxd 3 // ***rx data pin***
#define rxe 4 // ***rx enable pin***
#define delta 100 // ***Максимальное время дельта***
#define mintime 100 // ***Минимальное время импульса***
unsigned int time,oldtime,count,log0,log1; // ***Переменные которые принимают значения от 0 до 65535***
byte data[8]; // ***Массив для хранения информации с RX***
void setup() // ***Инициализирует и устанавливает***
{
pinMode(rxd,INPUT); // ***Устанавливаем как Вход***
pinMode(rxe,OUTPUT); // ***Устанавливаем как Выход***
digitalWrite(rxe,LOW); // ***Включить резистор на выводе аналогового входа 1***
attachInterrupt(rxd,pinint,CHANGE); // ***Обработки внешнего прерывания,(CHANGE прерывание вызывается при смене значения на порту, с LOW на HIGH и наоборот)***
Serial.begin(115200);
Serial.println("***STARLINE 64 Bit Receiver Started***");
interrupts(); // ***Включены прерывания***
}

void loop() // ***Выполнения программы***
{
pinint();
}

void pinint()
{
if(digitalRead(rxd)==HIGH)oldtime=micros(); //
else{
time=micros()-oldtime; //
if(time<mintime)return; //
if(constrain(time,log0-delta,log0+delta)==time)savebit(false); //
else if(constrain(time,log1-delta,log1+delta)==time)savebit(true); //
else{
log0=time/2; //
log1=time/4; //
count=0; //
}
}
}
void savebit(boolean val)
{
for(int i=1;i<=8;i++) //
{
data[i]=data[i]<<1; //
if(i<8)if(bitRead(data[i+1],7))bitSet(data[i],0); //
}
if(val)bitSet(data[8],0); //
count++; //
if(count==64) //
{
Serial.print("STARLINE_"); //
for(int i=1;i<=8;i++)printhex(data[i]); //
Serial.println(""); //
}
}
void printhex(byte val)
{
if(val<=0x0F)Serial.print("0"); //
Serial.print(val,HEX); //

whoim
Offline
Зарегистрирован: 03.11.2011

 так а ошибка где была?

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Покрайне мери в терминал сыпятся данные после нажатия на пульт!!! А дальше буду модефецировать и разбиратся....

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Вот так ...

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

А пречем тут азбука??? 

whoim
Offline
Зарегистрирован: 03.11.2011

Phreaker Chernie пишет:

А пречем тут азбука??? 

да так, не бери в голову..

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ошибка была в том что в void loop небыло указано  pinint (); Поэтому и не выводился код приема...

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ну ладно не буду принимать так близко к сердцу... так как новичек!!! 

step962
Offline
Зарегистрирован: 23.05.2011

Phreaker Chernie пишет:

Ошибка была в том что в void loop небыло указано  pinint (); Поэтому и не выводился код приема...

Ну, это не ошибка. Это фича... ;)

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ссорри а что такое фича??? 

step962
Offline
Зарегистрирован: 23.05.2011

 Из Википедии (статья про "баг" - ошибка):

Популярное выражение «Это не баг, это фича» следует понимать буквально: это не ошибка, это предусмотренная особенность работы программы

Из англо-русского словаря:

feature (произносится примерно как "фича") - 1) особенность, характерная черта; деталь, признак, свойство; свойства, особенности, общий вид

В общем - шутка юмора с длинной бородой.

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Понятно буду иметь в видду на будущее...!

 

НУ ВОТ ЧЕТО С МАДИФИКАЦИЕЙ КОДА ПОКА ПРОГРЕССА НЕТ... ОБИДНО ИНФЫ МАЛО... 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Уважаемы step962 не моглибы вы мне обьяснить... Есле сможете понять...

Смотрите код по идее должин состоять из 64 байт

32 байта из них первые защифрованные они всегда должны быть разные 

32 байта последние не зашифрованные они вообще дожны быть всегда одинаковые!!!

 Не могу понять как это сделать...

Вот точная информация про пакет STARLINE http://trashgate.net/trashdb/StarLine

step962
Offline
Зарегистрирован: 23.05.2011

 Не код, а посылка (или пакет, или телеграмма).

Длина не 64 байта, а 64 бита.

По приведенной ссылке точной информации нет. Только общая.

Не сказано, ни что из себя представляет блок hop, ни как формируется код кнопки.

Все, что можно сделать на основании этой информации - написать логгер. Программульку, которая будет уметь слушать входную линию, различать импульсы преамбулы, нуля и единицы. Благо формат используется очень простой, с одинаковой скважностью всех элементов и различием только в длительности импульсов.

В общем, для начала научитесь определять период: в цикле считывайте состояние на входе сигнальной линии, запоминайте времена перехода с низкого уровня на высокий (достаточно в этот момент прочитать и запомнить значение функции micros()), по разнице между соседними моментами определяйте, какой элемент получен (преамбула, ноль или единица) и выводите соответствующее значение в файл или в Serial-канал.

А вот для того, чтобы понимать, что за посылку вы приняли, необходимо еще много-много информации об этом протоколе найти. 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Спасибо за разьеснения!!!! Вот толко мой код помоему есле я не ошибаюсь и работает как логгер...  

step962
Offline
Зарегистрирован: 23.05.2011

 У слова логгер несколько значений.

Это и тип рыболовного судна, если верить толковому словарю.

И устройство регистрации потока информации (от logging - регистрация, запиь (информации), протоколирование).

И еще, наверное, пара -другая неизвестных мне значений.

Если ваш код и работает как логгер в том смысле, который я вкладывал в это слово, то:

- очень хорошо

- на основании той информации, которая есть по приведенной вами ссылке, большего из устройства выжать не удастся. Например, устройство едва ли будет работать в качестве ключа, потому что оно не знает, как формируется блок "hop"

- но ведь он еще не работает, он только будет работать после устранения основных ошибок ;)

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Вот я и занимаюсь устронением ошибок,,, перепроверяю и изучаю доп. инфу ну пока продвежений не очень много!!! Однаму трудно разобратся... Как говарится одна голова хорошо А две еще лучше...!!! 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Уважаемы step962 как вы думаете а токой информации будет достаточно для нармального отображения покета????

1- http://trashgate.net/trashdb/KeeLoq

2- http://trashgate.net/trashdb/KeeLoqАлгоритм

ТОЛЬКО УЖЕ БРИЛОК ПРИДЕТСЯ ИСПОЛЬЗОВАТЬ С КОДИРОВКОЙ KeeLog... 

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Ну и вот типо описания...

Хотя Keelog уже отмирает, но многим будет интересна инфа формирование пачки.
Состав кодовой посылки
Формат передачи команды
;
; преамбула пауза кодовая посылка
; 512 us 12 раз 8*256 us 64 импульса с периодом 3*256 us
; +--+ +--+ +-...-+ +-++-++-++-++-++-...-+ +
; ¦ ¦ ¦ ¦ ¦ ¦ ¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦¦ ¦ ¦
; +--+ +--+ +--...----+ ++ ++ ++ ++ ++ +----------...-----------+
; пауза между посылками
; 50*256 us

 

; +-------------------------------------------+
; ¦ Переменная часть 32 ¦ Постоянная часть 32 ¦
; +-------------------------------------------+
; ************************************************** ******************
; Переменная часть - зашифрованная последовательность бит
; +----------------------------------------------------+
; ¦ Функция 4 ¦ Контрольное слово 12 ¦ Синхронизатор 16¦
; +----------------------------------------------------+
; Контрольное слово - последнии 12 бит серийного номера
;
; Постоянная часть
; +-------------------------------+
; ¦ Серийный номер 28 ¦ Функция 4 ¦
; +-------------------------------+
;
; Функци
; +----------------------------------------------------------------------------+
; ¦ Бит защищенной команды ¦ Бит кнопки 1¦ Бит кнопки 2 ¦ Флаг долгого нажатия ¦
; +----------------------------------------------------------------------------+
;
;
; Получение переменной части
; +-----------------+ +------------------------------------+
; ¦ Скремблер 32 ¦ <- ¦ Незашифрованная переменная часть 32¦
; +-----------------+ +------------------------------------+
; XOR
; +-----------------+
; ¦ Ключ 32 ¦
; +-----------------+
; \/ \/ \/ \/ \/
; +-------------------------------------+
; ¦ Зашифрованная переменная часть 32 ¦
; +-------------------------------------+
;
; Функция скремблера X^32+X^21+X^1+1
; +---+ +---+
; +------------------------>¦== +----------------->¦== ¦ --+
; ¦ +->¦ ¦ +->¦ ¦ ¦
; ¦ ¦ +---+ ¦ +---+ ¦
; ¦ +----+ +---+ ¦
; ¦ ¦ ¦ ¦
; ¦ +--------------------- ------ ------------------+ ¦
; +-¦ 32¦ 31¦ 30¦ 29¦ 28¦...¦ 21¦ ... ¦ 4 ¦ 3 ¦ 2 ¦ 1 ¦<---+
;  

Phreaker Chernie
Offline
Зарегистрирован: 11.02.2012

Пытаюсь намисать код вычесления времени посылок чет не получатся.... SOS SOS SOS