Важная информация

User Tag List

Страница 4 из 15 ПерваяПервая 12345678 ... ПоследняяПоследняя
Показано с 31 по 40 из 146

Тема: ImageUtils

  1. #31
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Пока проверено только на одном DX образе, но, учитывая, как оно делается - вроде должно работать по любому.

    Ну и - программа НЕ ПРОВЕРЯЕТ - чего вы ей подсунули, она тупо смотрит на параметры и делает работу по принципу - Вы это хотите - нате! То есть вполне можно взять на вход образ, который не RX01, сказать, что он RX01 и попросить загнать в образ RX02 Ну.. Сами виноваты

  2. #31
    С любовью к вам, Yandex.Direct
    Размещение рекламы на форуме способствует его дальнейшему развитию

  3. #32
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Ну и ещё одна доработка. При наличии, конечно, соотвествующего файла
    Код:
    Physical block N 26 -> 0:$PrimaryBootloader   
    Physical block N 27 -> 0:$SecondaryBootloader   
    Physical block N 28 -> 0:$PrimaryBootloader   
    .......
    Physical block N 42 -> 0:$SecondaryBootloader   
    Physical block N 43 -> 0:$SecondaryBootloader   
    Physical block N 44 -> 0:$SecondaryBootloader   
    Physical block N 45 -> 0:$SecondaryBootloader   
    Physical block N 47 -> 0:$SecondaryBootloader   
    Physical block N 49 -> 0:$Directory   
    .....
    Physical block N 1663 -> 0:FDF333.DOC   
    Physical block N 1664 -> 0:FDF333.DOC !! bad block !! 64 0 1
    Physical block N 1665 -> 0:FDF333.DOC   
    .....
    Physical block N 1738 -> 0:FDF333.DOC   
    Physical block N 1740 -> 0:FDF333.DOC   
    Physical block N 1976 -> 0:FILE.BAD   
    Physical block N 1996 -> 0:FILE.BAD !! bad block !! 76 0 21
    Physical block N 1998 -> 0:FILE.BAD   
    Physical block N 2000 -> 0:FILE.BAD
    Последний раз редактировалось Hunta; 03.11.2022 в 09:57.

  4. #33
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Последствия моего исправления руками битого образа и внешнего тестирования - найден сценарий, до которого я не додумался и не наткнулся - дубли файлов по именам. Доработка работы с дублями ведётся.

    И будёт ешё одна доработка - восстановление И удалённых файлов. Скорее всего - в подкаталог типа LostAndFound

  5. Этот пользователь поблагодарил Hunta за это полезное сообщение:

    dk_spb (08.11.2022)

  6. #34
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Первая прикидка нового
    Код:
    [2022-нояб.-08 22:09:51 Warning]  File with same name 'EEXEEX.EEX' found - saved as 'EEXEEX.EEX.2'
    PRM1  .MAC     3  11-OCT-1984      ZAP   .MAC     1  02-OCT-1984
    CTS   .MAC     1  02-OCT-1984      CFR   .MAC     1  02-OCT-1984
    PZU3  .OBJ     1  19-JUL-1984      FILE01.BAD     1  01-JAN-1972
    OZU   .OBJ     2  07-JUN-1984      SPG   .MAC     3  18-OCT-1984
    PRD3  .MAC     3  11-OCT-1984      RED   .MAC     2  17-OCT-1984
    FOR   .MAC     2  21-JUN-1984      PRM3  .MAC     3  11-OCT-1984
    VZU   .MAC     4  03-JUL-1984      RASPC .MAC     2  26-OCT-1984
    SMK   .BAK     1D 25-OCT-1984      ZPS   .MAC     2  20-JUN-1984
    RZU   .MAC     3  19-NOV-1984      IZSL  .MAC     4  14-JUN-1984
    RASP  .MAC     2  17-OCT-1984      TEXT5 .BAK     5  25-OCT-1984
    FILE02.BAD     1  01-JAN-1972      IZKL  .MAC     5  19-JUL-1984
    PRD3  .MAC     4D 11-OCT-1984      ZPRM  .MAC     3  13-JUN-1984
    UDL   .BAK     1D 20-SEP-1984      SPT   .MAC     2  29-JUN-1984
    NUM   .MAC     2  13-JUN-1984      SPT   .OBJ     1D 19-JUN-1984
    FILE04.BAD     1  01-JAN-1972      TYP   .MAC     2  13-JUN-1984
    UDL1  .MAC     8D 26-OCT-1984      IZM   .MAC     3  02-JUL-1984
    DATA  .MAC     5  20-JUN-1984      TEXT5 .MAC     5  30-OCT-1984
    SPM   .MAC     3  31-MAY-1984      RUVD  .MAC    10D 10-OCT-1984
    PRD2  .MAC     3  11-OCT-1984      IZSL  .MAC     4D 14-JUN-1984
    PRM2  .MAC     3  11-OCT-1984      PRD1  .MAC     3  11-OCT-1984
    DATA  .MAC     1D 20-JUN-1984      SBOR  .MAC    25  17-JUL-1984
    SPM   .MAC     3D 31-MAY-1984      WZU   .MAC     4  23-MAY-1984
    SBOR  .MAC     7D 17-JUL-1984      TEXT1 .MAC     8  12-JUN-1984
    WKL   .MAC    22  09-JUL-1984      RZU   .MAC     3D 15-OCT-1984
    TEXT4 .MAC    11  18-OCT-1984      TEXT5 .MAC     5D 30-OCT-1984
    SMK   .MAC     3  26-OCT-1984      UDL   .MAC     8  30-OCT-1984
    UDL   .MAP     5D 26-OCT-1984      VVTO  .MAC     9  17-OCT-1984
    FILE03.BAD     1  01-JAN-1972      TVZU  .MAC    13  23-MAY-1984
    TKON  .MAC    14  10-OCT-1984      RUVD  .MAC    10  13-NOV-1984
    TEXT2 .MAC    11D 18-OCT-1984      PSM   .MAC     4  26-OCT-1984
    SBORM .MAC     9D 11-OCT-1984      FILE05.BAD     4  01-JAN-1972
    TEXT3 .MAC    16  17-OCT-1984      SBORM .MAC    26  22-OCT-1984
    UDL1  .OBJ    10D 26-OCT-1984      TEXT2 .MAC    13  18-OCT-1984
    GENER .MAC    15  12-OCT-1984      IZKN  .MAC    11  11-OCT-1984
    PSM   .OBJ    10D 26-OCT-1984      FILE06.BAD     5  01-JAN-1972
    GENER .MAC    17D 12-OCT-1984      FILE07.BAD     1  01-JAN-1972
    EEXEEX.EEX     8D 01-AUG-1972      FILE08.BAD     1  01-JAN-1972
    EEXEEX.EEX     6D 01-AUG-1972      FILE09.BAD    32  01-JAN-1972
    IZKN  .MAC    14D 11-OCT-1984
     77 files, 342 blocks
     138 Free blocks

  7. Этот пользователь поблагодарил Hunta за это полезное сообщение:

    dk_spb (08.11.2022)

  8. #35
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Очередная доработка по более правильному поведению программы в случае ошибок в образе - для образов с RT-11.
    Для тех, кто использует ImageUtils - по присланной вам ссылке выложена обновлённая версия - но она пока без особо-интенсивного тестирования. В тепличных условиях работает, в случае ошибок - сообщения о них приветствуются

  9. #36
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

    Скажем, есть образ диска RT-11. Там есть home block (блок с номером 1). Допустим, хочу я его проинить - соотвественно, мне надо проинитить элементы массива со смещением (пусть массив байтовый) от 512 до 1023. А ещё есть сегменты каталога - много - со смещениями [6*512..8*512-1], [8*512..10*512-1] и так далее.. И каждый раз надо эти смещения считать.

    Но в восьмой версии C# появились диапазоны (range) и можно выпилить кусок из массива, написав что то типа homeBlock = image[512..1023] и поразвлекаться с homeBlock, используя уже более простой индекс - от 0 до 511. Удобно? Да. Но есть нюанс. Это будет работа не с куском из шmage, а со вполне самостоятельным экземпляром массива, то есть, по сути - image[512..1023] - всего лишь удобный способ вызвать Array.Copy(), в нашем случае - что-то типа
    Код:
      homeBlock = new byte[512];
      Array.Copy(image, 512, HomeBlock, 0, 512)
    О да, не спорю - пришлось набить ГОРАЗДО МЕНЬШЕ символов, а реальный код, напоминающий вышенаписанное - сгенерит компилятор (традиционное название подхода - синтаксический сахар и его сейчас в C# - МНОГО ).

    Но что если я хочу проинить HomeBlock? А потом записать Image в файл? Упс.. Придётся скопировать HomeBlock обратно в Image и вспомнить про смещения. Не.. Не сильно легче и удобно

    И таких моментов у меня в ImageUtils накопилось.. Много Идея появилась с примерно неделю назад, примерно со среды (вечера, плюс момент засыпания) крутилась в голове и вот сегодня я набросал код SmartArray Теперь можно написать примерно так:

    Код:
          SmartArray<byte> image = new SmartArray<byte>(65536);
          SmartArray<byte> homeBlock = image[512..1023];
    
          homeBlock[0] = 10;
          homeBlock[1] = 12;
    И записываемые значения 10 и 12 попадут куда надо - в элементы 512 и 513 массива image. Этакий эквивалент (для знатоков) оператора EQUIVALENCE в FORTRAN-е

    А теперь хочу попробовать обойтись без методов работы с image на уровне блоков (помним же, что это образ диска, а на диске блоки, да ещё и бывают физические и логические, да ещё и интерлейс.. ) - аж два набора методов для чтения-записи. Брррр

    И вот видется мне подход, когда на считанный image я кладу два отображения - физические блоки и логические, плюс указываю методо подсчёта интерлейса для физических блоков... Что то типа (пока это фантазия )

    Код:
          SmartArray<byte> image = new SmartArray<byte>(65536);
          SmartArray<byte>[] logical = image[,, 512];
          SmartArray<byte>[] physical = image[,, 128];
    И писать что то типа logical[1][0] = 10 попадая как раз в home block (логический блок 1, физические блоки 36-38-39-40, смещения 4608..4735, 4864..4991 ну и так далее

    Ну и начала крутиться в голове похожая идея, только более сложная - для DisAsm-а, поскольку там в LDA, SAV, TSK и им подобным файлам куча служебки, а уж в OBJ её на порядок больше, плюс команды бывают одно, двух, трёх, четырёх и пятисловные.. Но там её ещё надо, засыпая, покрутить

    Пока попробую для ImageUtils (и TU58fs)

    - - - Добавлено - - -

    Засада подкралась оттуда, откуда не ждали range - он только int, то есть максимальный размер образа - 2 Гб Ну, если сделать блочный режим - тогда в принципе норм 1 ТБ - что перекрывает максимальный размер диска или раздела для ODS-1. Но с образами от VMS могут быть проблемы...
    Последний раз редактировалось Hunta; 11.11.2022 в 22:30.

  10. #37
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Перепилил ImageUtils на использование SmartArray<byte> вместо byte[].

    Пока код был изменён в лоб, никаких плюсов от SmartArray<byte> использовано не было.

    Попутно исправил несколько ошибок, которые проявились бы в специфических сценариях, но могли проявится.

    И код, который был написан для обнаружения и сохранения дубликатов в ФС RT-11, неожиданно выстрелил в ODS-1 - оказалось, не совсем корректно был написан код, который сохранял файл в нескольких вариантах - прицел был на текстовые файлы. Помню, бродили тогда некоторые мысли - но уже не помню, до чего я тогда додумался и по любому - код был написан некорректно. Подумал, поправил в лоб, потом ещё подумаю.

    Думаю порезвится с использованием новых возможностей на модуле работы с ФС RT-11 - она весьма простая, но большая часть кода получена в наследование и не использовался даже подход с описанием структуры ФС в виде классов с аттрибутами - как я сделал для ODS-1. Хотел давно переделать - вот и удобный случай

    Но сначала посплю

  11. #38
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

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

  12. #39
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Модуль работы с образом на блочном уровне. Было 376, стало 215 строк - весь код работы с физическими блоками (включая интерлейс) перенесён на более низкий уровень. И методы стали гораздо проще

    Теперь постепенное избавление от использоваия как результата byte[] и переход на SmartArray

  13. #40
    Guru
    Регистрация
    30.11.2015
    Адрес
    г. Самара
    Сообщений
    7,005
    Спасибо Благодарностей отдано 
    287
    Спасибо Благодарностей получено 
    631
    Поблагодарили
    531 сообщений
    Mentioned
    13 Post(s)
    Tagged
    0 Thread(s)

    По умолчанию

    Как было
    Код:
          stream.Data = new RADImage((ImageData.BlkGetBlocks(start, blkCount)))
    При этом метод BlkGetBlocks создавал байтовый массив нужного размера, в который копировал содержмое соответствующих блоков образа. Думаю, понятно, что если изменить какой то байт в stream.Data, то, что бы это появилось в образе диска - нужно скопировать обратно.

    Как стало
    Код:
          stream.Data = ImageData[start..(start+blkCount)];
    Первое. Вообще никакого копирования В принципе!
    И второе - если что то изменить в stream.Data - оно (волшебным образом ) материализуется в ImageData

    - - - Добавлено - - -

    А теперь работает и обратно
    Код:
    	ImageData[start..(start + blkCount)] = stream.Data;
    Но, конечно, если stream.Data создана на основе ImageData, то операция как лишена всякого смысла

Страница 4 из 15 ПерваяПервая 12345678 ... ПоследняяПоследняя

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Ваши права

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