Вернуться   CoderX :: Forums > Основные форумы > Программинг
Войти через OpenID

Программинг Форум для тем связанных с программированием

Чат (Новых сообщений с момента вашего последнего визита нет)
Загрузка...
Задавайте ваши вопросы на форуме. Чат предназначен для небольших разговоров.
 
Ответ
 
Опции темы Опции просмотра
Старый 24.09.2012, 01:39   #11
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

вот так у меня все заработало:



Код:
unit Opcode;

interface

var
  _1_byte_table: string;
  _2_byte_table: string;
  _seed: integer;


  procedure _init_tables();
  function _encode_1ID(_ID: char):char;
  function _encode_2ID(_ID: char):char;


implementation


  function _pseudo_rand: integer;
  var
    a : integer;
  begin

      a := (Int64(_seed) * $343fd + $269EC3) and $FFFFFFFF;
      _seed := a;
      result := (_seed shr $10) and $7FFF;

  end;


    procedure _init_tables();
  var
    i : integer;
    x : Char;
    x2: Word;
    rand_pos : integer;
    cur_pos : integer;
  begin

      _1_byte_table := '';
      _2_byte_table := '';


      for i := 0 to $D0 do begin
        _1_byte_table := _1_byte_table + chr(i);
      end;
      for i := 0 to $66 do begin
        _2_byte_table := _2_byte_table + chr(i) + #$0;
      end;

      for i := 2 to $D1 do begin
        rand_pos := (_pseudo_rand mod i) + 1;
        x := _1_byte_table[rand_pos];
        _1_byte_table[rand_pos] := _1_byte_table[i];
        _1_byte_table[i] := x;
      end;

      cur_pos := 3;
      for i := 2 to $67 do begin
        rand_pos := _pseudo_rand mod i;
        x2 := PWord(@_2_byte_table[rand_pos * 2 + 1])^;
        PWord(@_2_byte_table[rand_pos * 2 + 1])^:=PWord(@_2_byte_table[cur_pos])^;
        PWord(@_2_byte_table[cur_pos])^:=x2;
        cur_pos := cur_pos + 2;
      end;

      cur_pos := Pos(#$12, _1_byte_table);
      x := _1_byte_table[$13];
      _1_byte_table[$13] := #$12;
      _1_byte_table[cur_pos]:=x;

      cur_pos := Pos(#$B1, _1_byte_table);
      x := _1_byte_table[$B2];
      _1_byte_table[$B2] := #$B1;
      _1_byte_table[cur_pos]:=x;
  end;

  function _encode_1ID(_ID: char):char;
  var
    p: integer;
  begin
      p := pos(_ID, _1_byte_table);
      _ID:=Char(p-1);
     result:= _ID;
  end;

  function _encode_2ID(_ID: char):char;
  var
    p: integer;
  begin
        p:= pos(_ID, _2_byte_table);
        _ID:=Char(((p + 1) shr 1) - 1);
     result:= _ID;
  end;

end.
приходит пакет KeyInit - берем последние 4 байта, копируем в _seed, вызываем _init_tables();
приходит пакет CharSelected, повторяем действия - берем последние 4 байта, копируем в _seed, вызываем _init_tables();

для кодирования ID пакетов - одноайдишные - _encode_1ID,
двух айдишные - для первого ID - _encode_1ID, для второго _encode_2ID.
работает на птске.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
За это сообщение Elecktron нажился 4 спасибками от:
Старый 10.04.2013, 12:01   #12
Пользователь
 
Аватар для Be3geBJIa3
 
Регистрация: 23.01.2008
Сообщений: 93
Сказал Спасибо: 31
Имеет 65 спасибок в 23 сообщенях
Be3geBJIa3 пока неопределено
По умолчанию

Elecktron, не совсем правильно. Почему _2_byte_size выбран = 66? этот параметр переменный от версии протокола, не хватает 2 перестановок, возможно и больше. Я сам не могу полностью настроить для хроник больше Таути.

Есть у кого реализация алгоритма для хроник СТ31+?

Кое что нашел, оказывается таблицы 3, а не 2.

Последний раз редактировалось Be3geBJIa3, 10.04.2013 в 12:11.
Be3geBJIa3 вне форума   Ответить с цитированием
Старый 13.04.2013, 10:46   #13
Местный
 
Аватар для Elecktron
 
Регистрация: 27.10.2011
Адрес: Харьков
Сообщений: 106
Сказал Спасибо: 24
Имеет 11 спасибок в 7 сообщенях
Elecktron пока неопределено
По умолчанию

Цитата:
Сообщение от Be3geBJIa3 Посмотреть сообщение
Я сам не могу полностью настроить для хроник больше Таути.
это писалось для грации финал.
__________________
C++Builder 6, Delphi 7, RAD Studio XE2, MS VC++...
Elecktron вне форума   Ответить с цитированием
Ответ

  CoderX :: Forums > Основные форумы > Программинг



Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Часовой пояс GMT +4, время: 03:32.

vBulletin style designed by MSC Team.
Powered by vBulletin® Version 3.6.11
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Locations of visitors to this page
Rambler's Top100

Вы хотите чувствовать себя в безопасности? чоп Белган обеспечит её!