Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.04.2022, 02:03   #401
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Добавьте после проверки контрольной суммы:
Код:
if 2 * StrToInt('$' + st[i][3] + st[i][4]) + 4 <> len then
begin
Lines.Add(Format('Указанная в строке длина не соответствует настоящей %d: %s', [i + 1, st[i]]));
continue;
end;

Вот сейчас обмануть не удалось, то что надо.
Для Hex тоже такой пойдёт ?

Цитата:
Сообщение от BDA Посмотреть сообщение
Странно. У меня кракозябры вставляются, когда текст копировался с английской раскладкой клавиатуры, а если переключиться сначала на русскую, то всё хорошо.
А у меня такая беда , перезагрузил всё окей, потом опять кракозябры и пока не перегрузишь, ни чего не поможет.
Одно слово Хрюша, но сейчас она будет очень актуальна по нынешнем временам.....

Цитата:
Сообщение от BDA Посмотреть сообщение
Строка выводится, просто она нулевой длины. Сами посмотрите в текстовом редакторе, что именно в 2049 строке находится.
Да, факт !

Цитата:
Сообщение от BDA Посмотреть сообщение
Наверное, он игнорирует пустые строки. Добавьте перед всеми проверками длины:
Какой умный тритон !

Цитата:
Сообщение от BDA Посмотреть сообщение
Если строка короче 10 и длиннее 514, то она точно не может описывать корректную srec запись. После этих проверок можно проверять 1 и 2 символы, так как они точно есть в строке.
Вот это поворот судьбы !!! скачанный конвертер касячный сто пудово ! корректно делает файлы до 65536 байт , то есть S19, чуть увеличил размер файла и у-а-ля ! наша работа не напрасно , ой как не напрасна ! конвертер признаю браком, как разработчик писал его и выложил, загадка ?
У далось выяснить следующее: конвертер делает не смотря на размер файла, всё в формате S19,что в корне не правильно, наша прога чётко показала, что до адреса FFFF- 65536, всё корректно, а дальше, естественно касяк пошёл всё в формате S19 на выходе бракованный файл !
Хорошо что бесплатный конвертер, вот люди попали, кто не разбирается в формате и доверились конвертеру...
Смотрите что он делает , какие файлы!

Неправильная длина строки str № 2050: S123100000032003C0050005A007800A000 C800FA002C016801C201EE020C036603E80 374CA
Неправильная длина строки str № 2051: S12310020047E048804FFFF140032003C00 50002C0190015802EE028403B004DC05080 73473
Неправильная длина строки str № 2052: S12310040086009F6098C0AB80B100EC012 18157017781E2823E02EF03CA0415046B85 6C0CF
Неправильная длина строки str № 2053: S123100605DA08C050A141E23283235373C 46505A06080A0C101E00000100020005000 6003D
Неправильная длина строки str № 2054: S103100807C
Есть ошибки !

Вот такая бывает халтура в инете ....
Вложения
Тип файла: rar Тестовый № 2 - который надо преобразовать.rar (44.9 Кб, 2 просмотров)

Последний раз редактировалось BDA; 06.04.2022 в 08:59.
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 02:47   #402
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если строка короче 10 и длиннее 514, то она точно не может описывать корректную srec запись. После этих проверок можно проверять 1 и 2 символы, так как они точно есть в строке.
В финале сделал так :

Код:
if not OpenDialog1.Execute then
exit;
f:= TFileStream.Create(OpenDialog1.FileName, fmOpenRead or fmShareDenyWrite);
st := TStringList.Create;
st.LoadFromFile(OpenDialog1.FileName);
with Memo1 do
begin
Clear;
Lines.BeginUpdate;
for i := 0 to st.Count - 1 do
begin
len := length(st[i]);
if len = 0 then
continue;
if len mod 2 <> 0 then
begin
Lines.Add(Format('Íнеправильная длина строки  str ¹ %d: %s', [i+1, st[i]]));
continue;
end;
if len < 10 then
begin
Lines.Add(Format('длина строки слишком мала str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if len > 514 then
begin
Lines.Add(Format('длина строки слишком велика str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if st[i][1] <> 'S' then
begin
Lines.Add(Format('не хватает символа S str ¹ %d: %s', [i + 1, st[i]]));
continue;
end;
if (st[i][2] < '0') or (st[i][2] > '9') then
begin
Lines.Add(Format('несуществующий тип srec %d: %s', [i + 1, st[i]]));
continue;
end;
k := -1;
sum := 0;
j := 3;
while j < len do
begin
k := StrToIntDef('$' + st[i][j] + st[i][j + 1], -1);
if k = -1 then
begin
Lines.Add(Format('недопустимый символ в строке № %d: %s', [i+1, st[i]]));
end;
Inc(sum, k);
Inc(j, 2);
end;
if k = -1 then
continue;
if sum <> 255 then
begin
sum:= k - sum -1;
Lines.Add(Format('ошибка контрольной суммы  0x%.2x (âåðíàÿ 0x%.2x) str ¹ %d: %s', [k, sum, i+1, st[i]]));
continue;
end;
if 2 * StrToInt('$' + st[i][3] + st[i][4]) + 4 <> len then
begin
Lines.Add(Format('указанная длина строки не соответствует настоящей  str № %d: %s', [i + 1, st[i]]));
continue;
end;
end;
if Lines.Count > 0 then
Lines.Add(' есть ошибки !')
else
Lines.Add('ошибок не выявлено ! ');
Lines.EndUpdate;
label2.Caption:= 'количество  байт в файле :'+' ' +IntToStr(f.Size)+ ' ' + ' '+'Byte';
Label1.Caption :='количество строк в файле:  ' + IntToStr(st.Count-1+1);
Label3.Caption :=ExtractFileName(OpenDialog1.FileName);
end;
st.Free;
F.Free;
end;
sergey.serg-72 вне форума Ответить с цитированием
Старый 06.04.2022, 08:58   #403
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Для Hex тоже такой пойдёт ?
Да, только поправить позицию, откуда брать количество байт, и прибавляемую константу.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
скачанный конвертер касячный сто пудово
Ну бывает Адрес выводит 5ю символами, когда не влез в 4.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
В финале сделал так
Но всегда можно найти еще что проверить.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Старый 06.04.2022, 21:41   #404
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, только поправить позицию, откуда брать количество байт, и прибавляемую константу.
Как я понял идёт так : 1) количество байт, 2) адрес ?
Значит получается так для hex ?

Код:
 if 2 * StrToInt('$' + st[i][2] + st[i][3]) + 4 <> len then
begin
Lines.Add(Format('Указанная в строке длина не соответствует настоящей str № %d: %s', [i + 1, st[i]]));
continue;
end;
Цитата:
Сообщение от BDA Посмотреть сообщение
Ну бывает Адрес выводит 5ю символами, когда не влез в 4.
Бывает ? а сколько попало людей из за такого бывает ? очём разработчик думал вообще?
Фильтра нет, любые файлы загружай и на выходе полный капут, хотя работает только с bin, ограничение на размер файла , раз не более 65536 байт, не стоит...
Касячки однако не простительные ! Халтура полная !

Цитата:
Сообщение от BDA Посмотреть сообщение
Но всегда можно найти еще что проверить.
Что ещё не учли ?

Последний раз редактировалось BDA; 07.04.2022 в 06:05.
sergey.serg-72 вне форума Ответить с цитированием
Старый 07.04.2022, 04:31   #405
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Да, только поправить позицию, откуда брать количество байт, и прибавляемую константу.
Что то не получается, что то не учитываю, не пойму...
sergey.serg-72 вне форума Ответить с цитированием
Старый 07.04.2022, 05:50   #406
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
а сколько попало людей из за такого бывает ?
Предположу что мало. Это мы тут балуемся большими файлами, а в реальности может и не попадаются такие. Бесплатное чаще всего поставляется "AS IS", вся ответственность на пользователе. Файл после конвертера еще и программатору должен "понравиться". Так что еще не всё потеряно для пользователя.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Значит получается так для hex ?
Скорее так:
Код:
if 2 * StrToInt('$' + st[i][2] + st[i][3]) + 11 <> len then
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Что ещё не учли ?
Можно добавить:
Ошибка, когда запись S2 короче 12 символов, а S3 - короче 14 символов;
Предупреждение, когда в S1, S2, S3 типах пустое поле данных (тогда такая строка теряет смысл);
Ошибка, когда в S5-S9 есть поле данных;
Предупреждение, когда встречен S4;
Ошибка, когда S0, S5-S9 встречаются в файле более одного раза;
Ошибка, когда S0 не является первой записью;
Ошибка, когда S7-S9 не является последней записью;
Ошибка, когда не соотносится тип data записей с типом termination записей (например, S1 должны заканчиваться S9 и т.д.);
Ошибка, если встречаются S1, S2, S3 в одном файле.
Ошибка, если количество записей, указанное в S5 (S6), не соответствует количеству записей S1-S3 в файле.

И вполне вероятно еще что-то забыл.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 07.04.2022 в 06:04.
BDA вне форума Ответить с цитированием
Старый 07.04.2022, 21:42   #407
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Предположу что мало. Это мы тут балуемся большими файлами, а в реальности может и не попадаются такие. Бесплатное чаще всего поставляется "AS IS", вся ответственность на пользователе. Файл после конвертера еще и программатору должен "понравиться". Так что еще не всё потеряно для пользователя.
Как сказать, сегодня ребята технари сказали что 65536 байт, это размер распространённый и больше , что такой конвертер это брак однозначно и таким пользоваться нельзя.

Второй вопрос , вышел спор что размер 65536 байт, это типа уже S28, по документам, хотя многие редакторы S19, половина согласны что это ещё S19, другая половина что типа последний байт, это уже 10000 адрес , а значит S28. Редактор тритон и HxD это ещё S19, где правда? у многих софтов программаторов 65536 байт это включительно S19. А один документацию по Srec типа там уже S28. В общем так и не до чего не договорились. Но не могут же редакторы ошибаться ?

Цитата:
Сообщение от BDA Посмотреть сообщение
if 2 * StrToInt('$' + st[i][2] + st[i][3]) + 11 <> len then
так и знал что константа неправильная, откуда тогда 11 для Hex и 4 для Srec? не понятен этот момент.

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

Код:
 if k = -1 then
  continue;
if sum <> 0 then
begin
sum := k - sum;
Lines.Add(Format('Ошибка контрольной суммы 0x%.2x (верная 0x%.2x) str №  %d: %s', [k, sum, i+1, st[i]]));
continue;
end;
 if 2 * StrToInt('$' + st[i][2] + st[i][3]) + 11 <> len then
begin
Lines.Add(Format('Указанная в строке длина не соответствует настоящей str № %d: %s', [i + 1, st[i]]));
continue;
end;
Цитата:
Сообщение от BDA Посмотреть сообщение
Можно добавить:
Ошибка, когда запись S2 короче 12 символов, а S3 - короче 14 символов;
Предупреждение, когда в S1, S2, S3 типах пустое поле данных (тогда такая строка теряет смысл);
Ошибка, когда в S5-S9 есть поле данных;
Предупреждение, когда встречен S4;

Ошибка, когда S0, S5-S9 встречаются в файле более одного раза;
Ошибка, когда S0 не является первой записью;
Ошибка, когда S7-S9 не является последней записью;
Ошибка, когда не соотносится тип data записей с типом termination записей (например, S1 должны заканчиваться S9 и т.д.);
Ошибка, если встречаются S1, S2, S3 в одном файле.
Ошибка, если количество записей, указанное в S5 (S6), не соответствует количеству записей S1-S3 в файле.

И вполне вероятно еще что-то забыл.


Да, действительно значительные вещи. Надо тогда и их делать.
Вот только куда код вставлять ?

Цитата:
Сообщение от BDA Посмотреть сообщение
Можно добавить:
Тут момент пришёл в голову, а если в одной строке неправильная длина, ошибка контрольной суммы и неправильный символ в строке? Программа выведет только одну из трёх ошибок в строке, а другая проверка не выводится, что не совсем хорошо, информация должна быть полной.
Делать для каждой строки вывод в свой мемо, это куча мемо в программе и размер проги большой, не айс как то. Всё же правильней , если бы все ошибки в одной строке выводились, чтоб была полная и исчерпывающая информация, а то одна ошибка выводится, а две другие нет.Надо как то вывод в один мемо сделать, или какой другой компонент использовать чтоб все ошибки строки выводились.

Второй момент подумал, что надо результат анализа файла , дать возможность сохранить, для детального изучения строк, это удобней делать в блокноте. Да и солидней, когда даётся распечатка ошибок после анализа. Этот момент решил

Код:
begin
if Memo1.Text = ''  then
begin
MessageBox(handle,PChar('Поле не заполнено !'+#13#10), PChar('message'), 64);
exit;
end;
SaveDialog1.FileName:='Анализ файла';
if SaveDialog1.Execute then
Begin
Memo1.Lines.SaveToFile(SaveDialog1.FileName +'.txt');
ShowMessage('Фай успешно сохранён !');
End
else
ShowMessage('Сохранение файла отменено пользователем !');
end;
Теперь надо решить вопрос о выводе всех ошибок в строке, если таковы есть в одной строке.
И добавить Ваши новые проверки.

Последний раз редактировалось BDA; 16.04.2022 в 07:41.
sergey.serg-72 вне форума Ответить с цитированием
Старый 16.04.2022, 07:16   #408
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,289
По умолчанию

Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
типа последний байт, это уже 10000 адрес
Если размер файла 65536, то последний адрес $FFFF, так как нумерация с 0.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Но не могут же редакторы ошибаться ?
Могут и ошибаться. Или вводить свой стандарт или следовать разным стандартам. Например, в M68000 Family Programmer's Reference Manual я не вижу каких-то явных упоминаний размера, только размер поля (2, 3, 4 байта) под начальный адрес блока. Если использовать блоки по 252 байта и записывать данные с нулевого адреса, то последний блок будет иметь начальный адрес $FFF0, а конечный $100EB (размер файла 65772 байт). Так что нужно решать самому на какое описание опираться или к какому другому ПО подстраиваться. А если рассматривать старый код в этой теме, который выбирает, в какой именно формат кодировать входной файл, то проверка адреса последнего байта является наиболее простой, чтобы гарантировать корректность результата.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
откуда тогда 11 для Hex
В поле длины хранится только длина данных, а нужно еще учесть длину двоеточия, поля длины, поля адреса, поля типа, поля контрольной суммы (всего 11 символов).
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Вот только куда код вставлять ?
Ну какой куда. Это можно понять, когда начнете добавлять код. Понадобятся и дополнительные переменные.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
Программа выведет только одну из трёх ошибок в строке, а другая проверка не выводится, что не совсем хорошо, информация должна быть полной.
Какие-то ошибки можно выявлять одновременно, но если рассматривать именно эти три, то я не вижу это возможным. Если строка неверной длины, то она уже не может быть верной S-записью. Если в строке есть неверные символы, то невозможно оценить правильность контрольной суммы, так как складывать нечего.
Цитата:
Сообщение от sergey.serg-72 Посмотреть сообщение
дать возможность сохранить, для детального изучения строк, это удобней делать в блокноте
Ну да, дать возможность быстро сохранить результат в файл правильно. А насчет удобства - не хватает только вертикального скроллбара у мемо (можно включить), а больше блокнот ничего не предлагает.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.04.2022 в 07:39.
BDA вне форума Ответить с цитированием
Старый 17.04.2022, 00:32   #409
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Если размер файла 65536, то последний адрес $FFFF, так как нумерация с 0.
Да, тут инженер тоже ответил, что всё правильно и что с 0 адреса. Просто в редакторе HxD последний байт выделяешь адрес FFFF, в тритоне 10000, но всё ровно тритон делает S19 . И как мне ответили, что разработчик тритоши очень грамотный инженер и кодер, я на его сайте задал вопрос, там мне инженер ответил. Беда с этими даташитами, только в заблуждение вводят.
Хотя разработчик пони видимо чтоб подстраховаться делает S28 уже с 65536 байт.
Всё оставляем как есть. Решили.
sergey.serg-72 вне форума Ответить с цитированием
Старый 17.04.2022, 00:34   #410
sergey.serg-72
Форумчанин
 
Регистрация: 12.03.2019
Сообщений: 376
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Так что нужно решать самому на какое описание опираться или к какому другому ПО подстраиваться. А если рассматривать старый код в этой теме, который выбирает, в какой именно формат кодировать входной файл, то проверка адреса последнего байта является наиболее простой, чтобы гарантировать корректность результата.
Да, решил всё остаётся по старому, если что, то исправить не трудно, но пока всё решилось.
sergey.serg-72 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно создать "батник", вырезать из "2.txt" первых n строк и вставить их в "1.txt" temphard Помощь студентам 2 03.09.2013 16:03
Удаление первых n-строк из txt-файла Neksion Помощь студентам 2 10.07.2013 18:12
Создать чтение из файла и запись в файл txt на С++ skifre Фриланс 0 01.06.2012 16:16
поиск и выципление строк из txt файла D_e_n_n Помощь студентам 7 04.02.2011 05:39
C# Представление txt файла как массива строк asheb Помощь студентам 7 20.04.2010 12:51