История повреждена, некоторые данные утеряны.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Как вы сами заметили, зависит в большей степени как-раз только от алгоритма лечения.Rapid D писал(а):
Зависит от места повреждения.По идее должно пропуститься только одно событие!
Пожалуй это можно назвать "женским" алгоритмом поиска ошибокВ текущей версии контролируются следующие поля: what, event-type, длина extra-info (не более 16-ти байт, хотя мне кроме 12-ти байтового варианта еще не встречалось), длина body (не более 8кб, хотя реально в аське разрешены сообщения длиной не более 7кб, вроде бы). Думаю добавить еще контроль поля event-time на адекватный год.
Итак, если какое либо поле в записи истории (chunk) не подходит проверяемым критериям, запускается простой перебор следующих байт файлов (сквозное сканирование) на наличие поля what.
Как правильно заметил SUMBUR - не видя кода, сложно давать рекомендации и указывать ошибки.Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования.
За рекомендации или указания на ошибки буду благодарна.
Раз уж вы всё равно собираетесь открывать код...
А то ещё получиться потом, как с historylib.dll - будет SUMBUR нам перепаковывать вашу программку, чтобы антивирусы не ругались
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
cy6 писал(а):
Как вы сами заметили, зависит в большей степени как-раз только от алгоритма лечения.Rapid D писал(а):
Зависит от места повреждения.По идее должно пропуститься только одно событие!
Пожалуй это можно назвать "женским" алгоритмом поиска ошибокВ текущей версии контролируются следующие поля: what, event-type, длина extra-info (не более 16-ти байт, хотя мне кроме 12-ти байтового варианта еще не встречалось), длина body (не более 8кб, хотя реально в аське разрешены сообщения длиной не более 7кб, вроде бы). Думаю добавить еще контроль поля event-time на адекватный год.
Итак, если какое либо поле в записи истории (chunk) не подходит проверяемым критериям, запускается простой перебор следующих байт файлов (сквозное сканирование) на наличие поля what.
Разве chunk не начинается с поля what в "мужском" варианте?
Мне думается, что самые опознаваемые поля в бинарнике файла истории, это 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;
Функцию чтения записи истории и контроля полей, по обсуждаемой теме, прилагаю. Всю программу не вижу смысла выкладывать на альфа (по русски - сырой) стадии.
Вложение Chunk_Read.zip не найдено
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- SUMBUR
- Не в сети
- Elite Member
- Сообщений: 188
- Спасибо получено: 0
По-моему, смысл есть. Не желаю Вам ничего дурного, но вдруг с Вами что-нибудь незапланированное случится.Всю программу не вижу смысла выкладывать на альфа (по русски - сырой) стадии.
С чего Вы взяли что R.D. мужчина?Разве chunk не начинается с поля what в "мужском" варианте?
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Если уж выкладываете только функцию, то думаю предполагается, что она не использует внешних переменных!
А то как-то странно видеть в ней всякие fErrorReason, fErrorPos, fHFile, fWhat, fSenderUIN, ...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Прошу прошения, думала что название переменных (членов класса) само объясняет их назначение.Глянул мельком на вашу функцейку - жесть!
Если уж выкладываете только функцию, то думаю предполагается, что она не использует внешних переменных!
А то как-то странно видеть в ней всякие fErrorReason, fErrorPos, fHFile, fWhat, fSenderUIN, ...
Вот сам интерфейс класса:
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 - абсолютная позиция в файле, во вчерашней версии (которую обсуждаем) не использовалась. Предназначена для составления карты файла истории.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Назначение то понятно, а вот используемые типы для них - нет.Прошу прошения, думала что название переменных (членов класса) само объясняет их назначение.
А то ведь множество ошибок бывает именно из-за неправильных типов...
В целом алгоритм мне не очень нравится
Крайне неоптимально и хрупко.
Но думаю совместными усилиями сможем сделать хорошую лечилку
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Я не сказать, чтобы начинающая програмерша, ламерских ошибок почти не делаю.Назначение то понятно, а вот используемые типы для них - нет.
А то ведь множество ошибок бывает именно из-за неправильных типов...
То есть, ошибки от незнания особенностей языка или ООП, или кодинга алгоритмов как такового, крайне маловероятны. Самой приходится время от времени править код "начинающих", особенно на 1С, хотя там типов совсем нет, но бывает очень страшно.
Да, неоптимально совершенно, делался наспех, оптимизация только впереди. Потому и не выкладываю весь код, пока. От прежнего кода останутся скорее всего только общие очертания и идеи. На настоящем этапе интересно насколько логично идет контроль полей, соответствует ли он программе (RnQ, &RQ).В целом алгоритм мне не очень нравится
Крайне неоптимально и хрупко.
Да, конечно.Но думаю совместными усилиями сможем сделать хорошую лечилку
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
А я не говорить про ламерские ошибкиRapid D писал(а):
Я не сказать, чтобы начинающая програмерша, ламерских ошибок почти не делаю.Назначение то понятно, а вот используемые типы для них - нет.
А то ведь множество ошибок бывает именно из-за неправильных типов...
То есть, ошибки от незнания особенностей языка или ООП, или кодинга алгоритмов как такового, крайне маловероятны. Самой приходится время от времени править код "начинающих", особенно на 1С, хотя там типов совсем нет, но бывает очень страшно.
Вот например у вас ф-и:
function FileOpen(UIN: Integer): Boolean;
function FileCreate(UIN: Integer): Boolean;
Как они откроют файл истории "0Spamers"?
А ведь у некоторых людей он битый... (была ошибка в одном из билдов, и в этот файл писалось не то).
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- DC_
- Не в сети
- Senior Member
- Сообщений: 41
- Спасибо получено: 0
Но думаю совместными усилиями сможем сделать хорошую лечилку
Да, конечно.
С нетерпением жду хотя бы бэтку.
Есть много-много ошибок по хистори, буду тестировать.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Я помню про этот файл, но не подумала, что кому то нужна история спама.Как они откроют файл истории "0Spamers"?
А ведь у некоторых людей он битый... (была ошибка в одном из билдов, и в этот файл писалось не то).
Мысль была такая, мало ли что валяется в каталоге хистори, нам нужны только файлы похожие на UIN, для чего был специальный отбор написан в другом модуле.
Ну если он кому то нужен, думаю добавить не проблема.
А FileOpen и FileCreate я уже перенесла в отдельный юнит FileIO (основанный на вызовах только WinAPI), который будет в следующей версии. Естественно и прототипы другие. ^_^
DC_ писал(а):
Я тоже жду результатов тестирования альфы, а конкретно, что остается в отремонтированном файле. В частности, непрерывная часть старой истории, и более новой.С нетерпением жду хотя бы бэтку.
Есть много-много ошибок по хистори, буду тестировать.
Хотя, некоторые недостатки алгоритма уже известны, но все же...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- DC_
- Не в сети
- Senior Member
- Сообщений: 41
- Спасибо получено: 0
Я тоже жду результатов тестирования альфы, а конкретно, что остается в отремонтированном файле. В частности, непрерывная часть старой истории, и более новой.
Хотя, некоторые недостатки алгоритма уже известны, но все же...
Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
bak, это и есть переименованный оригинал.Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.
Если Вам несложно будет его обратно переименовать (убрать расширение .bak), повторить процедуру, и скопировать сюда вывод программы (текстовая область "сообщения"), я была бы очень признательна. Там должны выводится ошибки.
Я, к сожалению, не владею хорошим набором битых файлов истории, и протестировать не на чем.
Портила один специально, затерев часть поля what винхексом, и у меня программа отлично отработала, удалив только одну порченную запись.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- SUMBUR
- Не в сети
- Elite Member
- Сообщений: 188
- Спасибо получено: 0
cy6 писала:Но думаю совместными усилиями сможем сделать хорошую лечилку
Да, конечно.
Осмелюсь внести предложение.
Все эти "лечилки" это конечно хорошо, но почему бы вам не сделать ваше сотрудничество ещё более полезным. Rapid D, Вы только вдумайтесь: cy6, и "винхексом" владеет, и чужие ошибки править умеет, и сама "ламерских ошибок" почти не делает, и со свободным временем у неё, вероятно, всё в порядке (она, похоже, даже в игры не играет) – просто чудо, а не человек. Может Вам стоит открыть ей проблемную часть своего исходного кода. Возможно, она свежим взглядом сумеет отыскать и исправить то, что до сих пор не даёт возможности релизу "релизоваться". Синергия, по-моему, от такого тандема вполне возможна, если конечно вы оба не будете против такого взаимодействия. И пользователям, опять же, радость и полное (ну или почти полное) удовлетворение.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Тут я уже ожидал прочитать "жить вместе"Rapid D писал(а):
cy6 писала:Но думаю совместными усилиями сможем сделать хорошую лечилку
Да, конечно.
Осмелюсь внести предложение.
Все эти "лечилки" это конечно хорошо, но почему бы вам не сделать ваше сотрудничество ещё более полезным. Rapid D, Вы только вдумайтесь: cy6, и "винхексом" владеет, и чужие ошибки править умеет, и сама "ламерских ошибок" почти не делает, и со свободным временем у неё, вероятно, всё в порядке (она, похоже, даже в игры не играет) – просто чудо, а не человек. Может Вам стоит
SUMBUR писал(а):
Если вы о строке "FilterEdit.visible := True" - то что тут ещё открывать?открыть ей проблемную часть своего исходного кода. Возможно, она свежим взглядом сумеет отыскать и исправить то, что до сих пор не даёт возможности релизу "релизоваться".
Проблема мне видица скорее в Delphi2010. Но юзать Delphi2009 чтото влом.
Но что-то ушли мы от темы.
Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
2. Исследуем отрезок на правильность.
3. Находим 3-ю точку, в которой начинается последовательность #$FF#$FF#$FF#$FF
4. Исследуем второй отрезка на правильность записи.
5. Если оба правильные, то сдвигаемся на одну точку дальше (переход к шагу 3).
6. Если ошибок не встретилось, то END.
Дальше начинаются разные варианты ошибок.
Это опишу потом
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Дороговато может получится, при почасовой оплате.Тут я уже ожидал прочитать "жить вместе"
Мысль об исследовании участков между вероятными полями what понятна. Более того,я уже ее высказывала в общей форме.Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
2. Исследуем отрезок на правильность.
3. Находим 3-ю точку, в которой начинается последовательность #$FF#$FF#$FF#$FF
4. Исследуем второй отрезка на правильность записи.
5. Если оба правильные, то сдвигаемся на одну точку дальше (переход к шагу 3).
6. Если ошибок не встретилось, то END.
Только мне кажется, что стоить еще добавить сюда сканирование всех возможных полей event-time, который может служить еще лучшим признаком записи chunk (при своей длине 8 байт и строгого содержания поля), даже если what (-1) затерта.Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования.
Также, возможно будет удобнее не болтаться в анализе между полями, а делать полный первый проход с составлением карты файла. По мере реализации будет видно, как будет более оптимально.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- DC_
- Не в сети
- Senior Member
- Сообщений: 41
- Спасибо получено: 0
DC_ писал(а):
bak, это и есть переименованный оригинал.Отремонтированных файлов просто нет. У меня "Альфа" удалила оригинал и оставила только с расширением bak. И всё.
Если Вам несложно будет его обратно переименовать (убрать расширение .bak), повторить процедуру, и скопировать сюда вывод программы (текстовая область "сообщения"), я была бы очень признательна. Там должны выводится ошибки.
Я, к сожалению, не владею хорошим набором битых файлов истории, и протестировать не на чем.
Портила один специально, затерев часть поля what винхексом, и у меня программа отлично отработала, удалив только одну порченную запись.
Ошибка записи: 1
Файл: 204159
Ошибка: 102
Найдено продолжение файла
Успешно
Файл: 243701
Ошибка: 102
Файл: 284126
Ошибка: 102
Файл: 302371
Ошибка: 102
Файл: 378259
Ошибка: 102
Файл: 379221
Ошибка: 102
Файл: 392834
Ошибка: 102
Файл: 403053
Ошибка: 102
Файл: 409332
Ошибка: 102
Файл: 417569
Ошибка: 102
Файл: 420427
Ошибка: 102
Файл: 421857
Ошибка: 102
Файл: 425920
Ошибка: 102
Файл: 427407
Ошибка: 102
Файл: 430406
Ошибка: 102
Файл: 4304888
Ошибка: 102
Файл: 445575
Ошибка: 102
Файл: 463505
Ошибка: 102
Файл: 480213
Ошибка: 101
Файл: 483373737
Ошибка: 102
Файл: 48829666
Ошибка: 102
Файл: 8740222
Ошибка: 102
Или это не то что нужно?
Прячьте длинные логи под спойлер.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
Да уж, вы разаритесь пожалуйRapid D писал(а):
Дороговато может получится, при почасовой оплате.Тут я уже ожидал прочитать "жить вместе"
cy6 писал(а):
Непонятны мне всё же, зачем вы заостряете внимание на каких-то полях???Мысль об исследовании участков между вероятными полями what понятна. Более того,я уже ее высказывала в общей форме.
Только мне кажется, что стоить еще добавить сюда сканирование всех возможных полей event-time, который может служить еще лучшим признаком записи chunk (при своей длине 8 байт и строгого содержания поля), даже если what (-1) затерта.Я вот подумала, если повреждение будет где нибудь в поле длины (extra-info, body), с числом в большую сторону, то такая запись "проглотит" кусок нормальных записей. Этого можно избежать думаю только усложнением алгоритма от простого чтения, до сквозного первопроходного сканирования.
Также, возможно будет удобнее не болтаться в анализе между полями, а делать полный первый проход с составлением карты файла. По мере реализации будет видно, как будет более оптимально.
И под What вы понимаете метку начала записи?
Как то вы всё усложняете...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Хм, странно. А я думала всегда, что за "вместе" мужчины разоряются. До сих пор только такие экземпляры попадались.Да уж, вы разаритесь пожалуй
Непонятны мне всё же, зачем вы заостряете внимание на каких-то полях???
И под 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, как самые длинные и имеющие интересные значения. Таким образом, шанс вернуть из небытия некоторые порченные записи увеличится.
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- cy6
- Не в сети
- Elite Member
- Сообщений: 273
- Спасибо получено: 0
Не выходит, к сожалению. Тестирование полностью обновленной программы показало, что байты типа $FE и $FF часто встречаются в поле Body. Дальше наверное понятно, что происходит.Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
Буду думать и тестировать далее...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.
- Rapid D
- Не в сети
- Administrator
- Сообщений: 1995
- Спасибо получено: 35
И даже 4 подряд $FF встречаются часто? Вроде бы не должноRapid D писал(а):
Не выходит, к сожалению. Тестирование полностью обновленной программы показало, что байты типа $FE и $FF часто встречаются в поле Body. Дальше наверное понятно, что происходит.Алгоритм мне видица примерно таким:
1. Находим первые 2 точки в которых начинается последовательность #$FF#$FF#$FF#$FF.
Буду думать и тестировать далее...
Пожалуйста Войти или Регистрация, чтобы присоединиться к беседе.