История повреждена, некоторые данные утеряны.

Больше
15 года 2 нед. назад #21 от Rapid D
cy6 писал(а):

Rapid D писал(а):

По идее должно пропуститься только одно событие!

Зависит от места повреждения.

Как вы сами заметили, зависит в большей степени как-раз только от алгоритма лечения.

В текущей версии контролируются следующие поля: what, event-type, длина extra-info (не более 16-ти байт, хотя мне кроме 12-ти байтового варианта еще не встречалось), длина body (не более 8кб, хотя реально в аське разрешены сообщения длиной не более 7кб, вроде бы). Думаю добавить еще контроль поля event-time на адекватный год. :)
Итак, если какое либо поле в записи истории (chunk) не подходит проверяемым критериям, запускается простой перебор следующих байт файлов (сквозное сканирование) на наличие поля what.

Пожалуй это можно назвать "женским" алгоритмом поиска ошибок :silly:

Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования. :unsure:

За рекомендации или указания на ошибки буду благодарна.

Как правильно заметил SUMBUR - не видя кода, сложно давать рекомендации и указывать ошибки.
Раз уж вы всё равно собираетесь открывать код... :)

А то ещё получиться потом, как с historylib.dll - будет SUMBUR нам перепаковывать вашу программку, чтобы антивирусы не ругались :D

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад - 15 года 2 нед. назад #22 от cy6
Rapid D писал(а):

cy6 писал(а):

Rapid D писал(а):

По идее должно пропуститься только одно событие!

Зависит от места повреждения.

Как вы сами заметили, зависит в большей степени как-раз только от алгоритма лечения.

В текущей версии контролируются следующие поля: what, event-type, длина extra-info (не более 16-ти байт, хотя мне кроме 12-ти байтового варианта еще не встречалось), длина body (не более 8кб, хотя реально в аське разрешены сообщения длиной не более 7кб, вроде бы). Думаю добавить еще контроль поля event-time на адекватный год. :)
Итак, если какое либо поле в записи истории (chunk) не подходит проверяемым критериям, запускается простой перебор следующих байт файлов (сквозное сканирование) на наличие поля what.

Пожалуй это можно назвать "женским" алгоритмом поиска ошибок :silly:


Разве chunk не начинается с поля what в "мужском" варианте? :silly:
Мне думается, что самые опознаваемые поля в бинарнике файла истории, это what и event-time, из за своей длинны и уникального содержимого.
Поле event-type это просто байт (1..14), который можно перепутать с чем угодно. Поля длин и сами блоки переменной длины и разношерстного содержания - extra-info и body, еще более сложные для опознавания. Поправьте, если не так.

В самой RnQ 1100 запись истории опознается исключительно по полю what, и история перестает читаться, если такое поле не опознано.
case getInt of
    HI_event:
      begin
...
      end;
    HI_hashed: hashed:=getString;
    HI_cryptMode:
      begin
...
      end;
    else
      begin
       if not quite then
         msgDlg(getTranslation('The history is corrupted, some data is lost'),mtError);
       result:=FALSE;
       exit;
      end;
    end;
  end;

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

Вложение Chunk_Read.zip не найдено

Вложения:
Последнее редактирование: 15 года 2 нед. назад пользователем cy6.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #23 от SUMBUR
cy6 писала:

Всю программу не вижу смысла выкладывать на альфа (по русски - сырой) стадии.

По-моему, смысл есть. Не желаю Вам ничего дурного, но вдруг с Вами что-нибудь незапланированное случится. :)

Разве chunk не начинается с поля what в "мужском" варианте?

С чего Вы взяли что R.D. мужчина? :laugh:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #24 от Rapid D
Глянул мельком на вашу функцейку - жесть!
Если уж выкладываете только функцию, то думаю предполагается, что она не использует внешних переменных!
А то как-то странно видеть в ней всякие fErrorReason, fErrorPos, fHFile, fWhat, fSenderUIN, ...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #25 от cy6
Rapid D писал(а):

Глянул мельком на вашу функцейку - жесть!
Если уж выкладываете только функцию, то думаю предполагается, что она не использует внешних переменных!
А то как-то странно видеть в ней всякие fErrorReason, fErrorPos, fHFile, fWhat, fSenderUIN, ...

Прошу прошения, думала что название переменных (членов класса) само объясняет их назначение. :blush:
Вот сам интерфейс класса:
THistFile = class (TObject)
  private
    fPath: string;
    fHFile: Cardinal;
    fErrorReason: Integer;
    fErrorPos: Integer;
    fWhat: Integer;
    fEventType: Byte;
    fSenderUIN: Cardinal;
    fEventTime: TDateTime;
    fExtraInfo: PByte;
    fExtraInfoLen: Integer;
    fBody: AnsiString;
  protected
    function getDecriptedBody: string;
  public
    constructor Create(Path: string);
    destructor Destroy; override;
    function FileOpen(UIN: Integer): Boolean;
    function FileCreate(UIN: Integer): Boolean;
    procedure FileClose;
    function ChunkRead: Boolean;
    function ChunkWrite(src: THistFile): Boolean;
    function ChunkFind: Boolean;
    property ErrorReason: Integer read fErrorReason;
    property What: Integer read fWhat;
    property EventType: Byte read fEventType;
    property SenderUIN: Cardinal read fSenderUIN;
    property EventTime: TDateTime read fEventTime;
    property Body: string read getDecriptedBody;
  end;

THistFile.ChunkRead - это ключевая функция класса, которая определяет читабельность записи истории, и при возможности ее считывает.

fPath, fHFile - путь и дескриптор файла истории.

fWhat, fEventType, fSenderUIN, fEventTime, fExtraInfo, fExtraInfoLen, fBody - содержимое полей текущей считанной записи истории (chunk), в соответствии с форматом Rejetto.

fErrorReason - описание результата при попытке чтения записи истории (0 - без ошибок, или определенная ошибка, связанная с вводом/выводом или конкретным полем).

fErrorPos - абсолютная позиция в файле, во вчерашней версии (которую обсуждаем) не использовалась. Предназначена для составления карты файла истории.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад - 15 года 2 нед. назад #26 от Rapid D
cy6 писал(а):

Прошу прошения, думала что название переменных (членов класса) само объясняет их назначение. :blush:

Назначение то понятно, а вот используемые типы для них - нет.
А то ведь множество ошибок бывает именно из-за неправильных типов...


В целом алгоритм мне не очень нравится :(
Крайне неоптимально и хрупко.
Но думаю совместными усилиями сможем сделать хорошую лечилку :)
Последнее редактирование: 15 года 2 нед. назад пользователем Rapid D.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #27 от cy6
Rapid D писал(а):

Назначение то понятно, а вот используемые типы для них - нет.
А то ведь множество ошибок бывает именно из-за неправильных типов...

Я не сказать, чтобы начинающая програмерша, ламерских ошибок почти не делаю. :silly:
То есть, ошибки от незнания особенностей языка или ООП, или кодинга алгоритмов как такового, крайне маловероятны. Самой приходится время от времени править код "начинающих", особенно на 1С, хотя там типов совсем нет, но бывает очень страшно. :laugh:

В целом алгоритм мне не очень нравится :(
Крайне неоптимально и хрупко.

Да, неоптимально совершенно, делался наспех, оптимизация только впереди. Потому и не выкладываю весь код, пока. От прежнего кода останутся скорее всего только общие очертания и идеи. На настоящем этапе интересно насколько логично идет контроль полей, соответствует ли он программе (RnQ, &RQ).

Но думаю совместными усилиями сможем сделать хорошую лечилку :)

Да, конечно. :cheer:

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #28 от Rapid D
cy6 писал(а):

Rapid D писал(а):

Назначение то понятно, а вот используемые типы для них - нет.
А то ведь множество ошибок бывает именно из-за неправильных типов...

Я не сказать, чтобы начинающая програмерша, ламерских ошибок почти не делаю. :silly:
То есть, ошибки от незнания особенностей языка или ООП, или кодинга алгоритмов как такового, крайне маловероятны. Самой приходится время от времени править код "начинающих", особенно на 1С, хотя там типов совсем нет, но бывает очень страшно. :laugh:

А я не говорить про ламерские ошибки :)
Вот например у вас ф-и:
function FileOpen(UIN: Integer): Boolean;
function FileCreate(UIN: Integer): Boolean;
Как они откроют файл истории "0Spamers"? :)
А ведь у некоторых людей он битый... (была ошибка в одном из билдов, и в этот файл писалось не то).

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #29 от DC_

Но думаю совместными усилиями сможем сделать хорошую лечилку :)

Да, конечно. :cheer:


С нетерпением жду хотя бы бэтку.
Есть много-много ошибок по хистори, буду тестировать.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад - 15 года 2 нед. назад #30 от cy6
Rapid D писал(а):

Как они откроют файл истории "0Spamers"? :)
А ведь у некоторых людей он битый... (была ошибка в одном из билдов, и в этот файл писалось не то).

Я помню про этот файл, но не подумала, что кому то нужна история спама. :side:
Мысль была такая, мало ли что валяется в каталоге хистори, нам нужны только файлы похожие на UIN, для чего был специальный отбор написан в другом модуле.
Ну если он кому то нужен, думаю добавить не проблема. :)

А FileOpen и FileCreate я уже перенесла в отдельный юнит FileIO (основанный на вызовах только WinAPI), который будет в следующей версии. Естественно и прототипы другие. ^_^

DC_ писал(а):

С нетерпением жду хотя бы бэтку.
Есть много-много ошибок по хистори, буду тестировать.

Я тоже жду результатов тестирования альфы, а конкретно, что остается в отремонтированном файле. В частности, непрерывная часть старой истории, и более новой.
Хотя, некоторые недостатки алгоритма уже известны, но все же... :)
Последнее редактирование: 15 года 2 нед. назад пользователем cy6.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #31 от DC_
cy6 писала:

Я тоже жду результатов тестирования альфы, а конкретно, что остается в отремонтированном файле. В частности, непрерывная часть старой истории, и более новой.
Хотя, некоторые недостатки алгоритма уже известны, но все же... :)


Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #32 от cy6
DC_ писал(а):

Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.

bak, это и есть переименованный оригинал.

Если Вам несложно будет его обратно переименовать (убрать расширение .bak), повторить процедуру, и скопировать сюда вывод программы (текстовая область "сообщения"), я была бы очень признательна. Там должны выводится ошибки.

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

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад - 15 года 2 нед. назад #33 от SUMBUR
Rapid D писал(а):

Но думаю совместными усилиями сможем сделать хорошую лечилку :)

cy6 писала:

Да, конечно. :cheer:


Осмелюсь внести предложение.
Все эти "лечилки" это конечно хорошо, но почему бы вам не сделать ваше сотрудничество ещё более полезным. Rapid D, Вы только вдумайтесь: cy6, и "винхексом" владеет, и чужие ошибки править умеет, и сама "ламерских ошибок" почти не делает, и со свободным временем у неё, вероятно, всё в порядке (она, похоже, даже в игры не играет) – просто чудо, а не человек. Может Вам стоит открыть ей проблемную часть своего исходного кода. Возможно, она свежим взглядом сумеет отыскать и исправить то, что до сих пор не даёт возможности релизу "релизоваться". Синергия, по-моему, от такого тандема вполне возможна, если конечно вы оба не будете против такого взаимодействия. И пользователям, опять же, радость и полное (ну или почти полное) удовлетворение. :)
Последнее редактирование: 15 года 2 нед. назад пользователем SUMBUR.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #34 от Rapid D
SUMBUR писал(а):

Rapid D писал(а):

Но думаю совместными усилиями сможем сделать хорошую лечилку :)

cy6 писала:

Да, конечно. :cheer:


Осмелюсь внести предложение.
Все эти "лечилки" это конечно хорошо, но почему бы вам не сделать ваше сотрудничество ещё более полезным. Rapid D, Вы только вдумайтесь: cy6, и "винхексом" владеет, и чужие ошибки править умеет, и сама "ламерских ошибок" почти не делает, и со свободным временем у неё, вероятно, всё в порядке (она, похоже, даже в игры не играет) – просто чудо, а не человек. Может Вам стоит

Тут я уже ожидал прочитать "жить вместе" :laugh:

SUMBUR писал(а):

открыть ей проблемную часть своего исходного кода. Возможно, она свежим взглядом сумеет отыскать и исправить то, что до сих пор не даёт возможности релизу "релизоваться".

Если вы о строке "FilterEdit.visible := True" - то что тут ещё открывать? :)
Проблема мне видица скорее в Delphi2010. Но юзать Delphi2009 чтото влом.

Но что-то ушли мы от темы.

Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
2. Исследуем отрезок на правильность.
3. Находим 3-ю точку, в которой начинается последовательность #$FF#$FF#$FF#$FF
4. Исследуем второй отрезка на правильность записи.
5. Если оба правильные, то сдвигаемся на одну точку дальше (переход к шагу 3).
6. Если ошибок не встретилось, то END.
Дальше начинаются разные варианты ошибок.
Это опишу потом :)

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #35 от cy6
Rapid D писал(а):

Тут я уже ожидал прочитать "жить вместе" :laugh:

:laugh: Дороговато может получится, при почасовой оплате. :P

Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
2. Исследуем отрезок на правильность.
3. Находим 3-ю точку, в которой начинается последовательность #$FF#$FF#$FF#$FF
4. Исследуем второй отрезка на правильность записи.
5. Если оба правильные, то сдвигаемся на одну точку дальше (переход к шагу 3).
6. Если ошибок не встретилось, то END.

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

Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования.

Только мне кажется, что стоить еще добавить сюда сканирование всех возможных полей event-time, который может служить еще лучшим признаком записи chunk (при своей длине 8 байт и строгого содержания поля), даже если what (-1) затерта.
Также, возможно будет удобнее не болтаться в анализе между полями, а делать полный первый проход с составлением карты файла. По мере реализации будет видно, как будет более оптимально.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад - 15 года 2 нед. назад #36 от DC_
cy6 писал(а):

DC_ писал(а):

Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.

bak, это и есть переименованный оригинал.

Если Вам несложно будет его обратно переименовать (убрать расширение .bak), повторить процедуру, и скопировать сюда вывод программы (текстовая область "сообщения"), я была бы очень признательна. Там должны выводится ошибки.

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


ВНИМАНИЕ: Спойлер!


Или это не то что нужно?

Прячьте длинные логи под спойлер. ;)
Последнее редактирование: 15 года 2 нед. назад пользователем dek.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #37 от Rapid D
cy6 писал(а):

Rapid D писал(а):

Тут я уже ожидал прочитать "жить вместе" :laugh:

:laugh: Дороговато может получится, при почасовой оплате. :P

Да уж, вы разаритесь пожалуй :silly:

cy6 писал(а):

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

Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования.

Только мне кажется, что стоить еще добавить сюда сканирование всех возможных полей event-time, который может служить еще лучшим признаком записи chunk (при своей длине 8 байт и строгого содержания поля), даже если what (-1) затерта.
Также, возможно будет удобнее не болтаться в анализе между полями, а делать полный первый проход с составлением карты файла. По мере реализации будет видно, как будет более оптимально.

Непонятны мне всё же, зачем вы заостряете внимание на каких-то полях???
И под What вы понимаете метку начала записи?
Как то вы всё усложняете...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #38 от cy6
Rapid D писал(а):

Да уж, вы разаритесь пожалуй :silly:

Хм, странно. :unsure: А я думала всегда, что за "вместе" мужчины разоряются. :silly: До сих пор только такие экземпляры попадались. :laugh:

Непонятны мне всё же, зачем вы заостряете внимание на каких-то полях???
И под What вы понимаете метку начала записи?
Как то вы всё усложняете...


Поля
A CHUNK is so made:

int what
  case -1 (event)
    byte      event-type
    int       sender-uin
    datetime  event-time
    int       N
    N byte    extra-info   
    string    body (crypted)
  case -2 (hashed)
    string    hashed-password
  case -3 (crypt-mode) 
    int       following-data-length
    byte      crypt-mode (0 = simple, 1 = key method #1)

0xFFFFFFFF, это значение -1 поля what, означающее дальнейшую структуру event, а не hashed и не crypt-mode. Но я предлагаю вести поиски возможного начала записей не только по этому значению, а по всем фиксированным полям (имеющие фиксированную длину и предопределенный диапазон значений), в частности - what, event-type и event-time. Опираясь в основном на what и event-time, как самые длинные и имеющие интересные значения. Таким образом, шанс вернуть из небытия некоторые порченные записи увеличится.

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #39 от cy6
Rapid D писал(а):

Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.

Не выходит, к сожалению. Тестирование полностью обновленной программы показало, что байты типа $FE и $FF часто встречаются в поле Body. Дальше наверное понятно, что происходит. :(

Буду думать и тестировать далее...

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Больше
15 года 2 нед. назад #40 от Rapid D
cy6 писал(а):

Rapid D писал(а):

Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.

Не выходит, к сожалению. Тестирование полностью обновленной программы показало, что байты типа $FE и $FF часто встречаются в поле Body. Дальше наверное понятно, что происходит. :(

Буду думать и тестировать далее...

И даже 4 подряд $FF встречаются часто? Вроде бы не должно

Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.

Модераторы: bassvazoozaDelphukdekTiMeTraSheRLaDyStRaNGed0CeNTRapid D
Время создания страницы: 0.501 секунд
Работает на Kunena форум