Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Пт мар 29, 2024 14:10

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 7 ] 
Автор Сообщение
 Заголовок сообщения: *преобразовать текстовый файл данных в бинарный
СообщениеДобавлено: Пт ноя 30, 2007 00:38 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
При работе с альтеровскими ПЛИС-ами на MAX-Plus-е
когда-то у меня возникла необходимость преобразования
файла прошивки из текстового в бинарный


Когда-то я пытался сделать программу на Форте,
но получил неприемлимое (для работы с программой)
время исполнения, поэтому сделал преобразование на ассемблере.

Поэтому предлагаю решить такую задачу на Форте за минимальное время.

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

Код:
255,255, 98,127, 60,  0,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,255,
255,255,255,255,255,255,255,255,255,
  0, 12,128,  1, 48,  0,  6,192,  0, 24,  0,  3, 96,  0,100,177,  1,182,193,  6,216,  0, 27, 96,  3,108,128, 13,176, 13,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 12, 52,129, 50, 80,  6,202,116, 25, 40,  3,101,160, 12,148,233, 50, 80,  6,202,  0,152, 46,  3,101,128, 12,148,  1, 48,254,
  0, 18, 64,  2, 72,  0,  9, 32,  1, 36,128,  4,144,  0, 42,100,130,204,148,  9, 50, 65, 38,200,  4,153, 32, 19,100, 38,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 18,160,  2, 84,136, 10,209, 34, 42, 68,133,168, 16, 21,162, 69, 84,136, 10, 81, 33, 84, 64,133,168, 16, 23,224, 66,160,249,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,152,255,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  8,  0,  1, 32,  1,  4,128,  0, 16,  0,  2, 64,  2,  8,  0,  1, 32,  0, 32,128,  0, 16,  0,  0,  0,  0, 48,250,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0, 32,  0,132,130,  0, 16,  0,  2, 64,  0,  8,  0,  1, 40,  4,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  4,130,  0, 16, 26,  2, 64,  0,  8,  0,  1, 48,  4,  4,128,  0, 16,  0, 64, 64,  0, 10,  0,  0, 32,  0,216,254,
  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,192,  0, 18,  0, 66, 64,  8, 40,  0, 33, 16,  0,  2,128, 32,  0,  0,  0,  0,  0,  0,  0,  0,  0, 64,  0,  0,  0,  0,  0,  0,  0,  0,  0,  0,128,  2,  0,  0, 32,  0,  8, 16,  0,  5,  0,  4,  4,  0, 16, 64, 72,  0,  0, 32,  0,  0,  0,192,  0,232,249,


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

Задача в следующем:
1. есть файл ( для примера - файл test.ttf внутри этого зипа ) с такими данными.
2. Данные надо преобразовать в единый *.bin файл, т.е. преобразовать числа в нормальные байты.

внутри этого зипа
лежат файлы:
test.ttf - файл с тестовыми данными для примера
test.bin - преобразованный bin-файл (с ним надо сравнивать результат для проверки правильности работы программы)

решением должен быть exe-файл, который производит преобразование из ttf файла в bin файл, указанные в командной строке:

[pre]transttf.exe test.ttf test2.bin[/pre]

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 30, 2007 08:18 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
долго не заморачивался, надеюсь скорости хватит( в крайнем случае будет с чем сравнивать, да и подразогнать тоже можно 8) на P4M 2GHz на тестовом примере почти моментально выполняется

решение для SPF4.18
либы брал последние с cvs-а
Код:
\ 30-11-2007 ~mOleg
\ Copyright [C] 2007 mOleg mininoleg@yahoo.com
\ задачка с конкурса на форуме http://fforum.winglion.ru/viewtopic.php?t=1048
\ условие в конце

REQUIRE >CIPHER   devel\~moleg\lib\parsing\number.f
REQUIRE cmdline>  devel\~mOleg\lib\util\parser.f
REQUIRE SPELLS    devel\~moleg\lib\util\spells.f
REQUIRE s"        devel\~moleg\lib\strings\string.f
REQUIRE onward    devel\~moleg\lib\strings\subst.f
REQUIRE xWord     devel\~moleg\lib\parsing\xWordn.f

      0 VALUE sourceid   \ id файла исходника
      0 VALUE 'source
      0 VALUE #source
      0 VALUE collector  \ id файла приемника
      0 VALUE colbuf
      0 VALUE ^collector

\ помощь по использованию
SPELL: /? ( --> )
          s" \tusage: transttf.exe test.ttf [test2.bin]\n\r" TYPE
          BYE ;S

\ разбор ком. строки, открытие файлов
SECRET: NOTFOUND ( asc # --> )
                 <back ParseFileName 2DUP FILE-EXIST
                 IFNOT ." \tInvalid source file: " TYPE CR THEN
                 2DUP R/O OPEN-FILE IF ." \tCan't open source file: " TYPE CR EXIT THEN
                 TO sourceid
                 SeeForw NIP IF 2DROP ParseFileName
                              ELSE S" *.bin" onward
                             THEN 2DUP
                 W/O CREATE-FILE IF ." \tCan't create result file: " TYPE CR EXIT THEN
                 TO collector 2DROP
                 [COMPILE] \ ;S

\ читаем весь исходник в память.
: ReadSource ( --> )
             sourceid FILE-SIZE 2DROP \ считаем, что размер файла меньше 4 G
             DUP TO #source
             ALLOCATE THROW TO 'source \ считаем что получилось
             'source #source sourceid READ-FILE THROW
             #source <> THROW ;

\ выделить место под результирующий массив
: InitReceiver ( --> )
               #source 2/ ALLOCATE THROW DUP TO colbuf TO ^collector
               ;

\ сохранить результат
: SaveBuf ( --> ) colbuf ^collector OVER - collector WRITE-FILE THROW ;


s" \000\t\n\r, " Delimiter: delimiters

\ преобразование исходного текста
: Transform ( --> )
            'source #source SOURCE!
            BEGIN EndOfChunk WHILENOT

               BEGIN delimiters xWord DUP WHILENOT
                     2DROP EndOfChunk WHILENOT
                     >IN 1+!
                 REPEAT EXIT
               THEN

               0 0 2SWAP >NUMBER IF -1 THROW ELSE 2DROP THEN
               ^collector TUCK B! 1 + TO ^collector

            REPEAT ;

\ главное слово программы
: transttf ( --> )
           options
           sourceid IFNOT [ ALSO SPELLS ] /? [ PREVIOUS ] BYE THEN
           ReadSource  InitReceiver  Transform  SaveBuf
           sourceid CLOSE-FILE DROP collector CLOSE-FILE DROP
           BYE ;

' transttf MAINX !

S" transttf.exe" SAVE



если не хочется собирать самостоятельно, то готовый exe можно взять тут http://www.forth.org.ru/~mOleg/samples/transttf.exe

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Последний раз редактировалось mOleg Пт ноя 30, 2007 08:31, всего редактировалось 1 раз.

Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 30, 2007 08:29 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
А вот интересно, какую часть времени для исходных данных такого размера занимают операции чтения/записи файлов, а какую собственно преобразование?
Т.е., начиная с какого количества исходных данных, скорость именно преобразования будет значимой?

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 30, 2007 08:32 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Варнак писал(а):
А вот интересно, какую часть времени для исходных данных такого размера занимают операции чтения/записи файлов, а какую собственно преобразование?
Т.е., начиная с какого количества исходных данных, скорость именно преобразования будет значимой?

в принципе можно померять пропорци, но я сегодня уже хочу спать 8) так что желающим придется самим как-то это дело исследовать

подсказка REQUIRE ResetProfiles devel\~pinka\lib\Tools\profiler.f

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 30, 2007 09:55 
Не в сети

Зарегистрирован: Пн окт 15, 2007 17:24
Сообщения: 164
Откуда: Бийск
Благодарил (а): 0 раз.
Поблагодарили: 2 раз.
Спасибо за подсказку, но мешает вот это:
"решение для SPF4.18 либы брал последние с cvs-а".
В то время как раньше говорилось кем-то: "предлагаю ввести ограничение, согласно которому приведенное решение должно работать на последней стабильной сборке используемого форта. На данный момент для СПФ - это 4.18 базовая версия, без обновлений с CVS. "

А без последних либ не собирается, не знает вот этого "devel\~moleg\lib\parsing\xWordn.f", а с "devel\~moleg\lib\parsing\xWord.f" не работает.

_________________
And so forth ...


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт ноя 30, 2007 14:13 
Не в сети
Administrator
Administrator
Аватара пользователя

Зарегистрирован: Вт май 02, 2006 13:19
Сообщения: 3565
Откуда: St.Petersburg
Благодарил (а): 4 раз.
Поблагодарили: 72 раз.
mOleg писал(а):
http://www.forth.org.ru/~mOleg/samples/transttf.exe


просто удивительно! Он и на моем PIII-800 моментально исполняется - окошко консоли лишь промелькивает при запуске :)
При том, что моя старая программа это же самое делает несколько секунд, результат просто замечательный :)

_________________
С уважением, WingLion
Forth-CPU . RuF09WE
Мой Форт
Отсутствие бана это не заслуга юзера, а недоработка модератора (с)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн дек 03, 2007 04:01 
Не в сети
Moderator
Moderator
Аватара пользователя

Зарегистрирован: Чт май 04, 2006 00:53
Сообщения: 5062
Откуда: был Крым, теперь Новосибирск
Благодарил (а): 23 раз.
Поблагодарили: 63 раз.
Варнак писал(а):
Спасибо за подсказку, но мешает вот это:
"решение для SPF4.18 либы брал последние с cvs-а".
В то время как раньше говорилось кем-то: "предлагаю ввести ограничение, согласно которому приведенное решение должно работать на последней стабильной сборке используемого форта. На данный момент для СПФ - это 4.18 базовая версия, без обновлений с CVS. "

Виноват 8( но правда я спешил, времени было в обрез, так что прошу прощения 8)
Варнак писал(а):
А вот интересно, какую часть времени для исходных данных такого размера занимают операции чтения/записи файлов, а какую собственно преобразование?

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

_________________
Мне бы только мой крошечный вклад внести,
За короткую жизнь сплести
Хотя бы ниточку шёлка.
fleur


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 7 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


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

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB