forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   PureBasic (http://forum.boolean.name/forumdisplay.php?f=90)
-   -   Распаковка из архива-ресурса мимо файла (http://forum.boolean.name/showthread.php?t=19732)

barsunduk 10.03.2015 01:49

Распаковка из архива-ресурса мимо файла
 
кто-нибудь в курсе, можно ли сообразить какой-то аналог разархиватора? только не в файл чтобы распаковывал нужное вхождение, а в память. если конкретно - хочу все ресурсы запаковать в архив zip и доставать по одному файлу. что-то типа этого кода (см. ниже), но вместо ExtractWhatEverWayPngFromZipToBuffer(some_paramete rs) - рабочая процедурка чтоб была:

PHP код:

UseZipPacker()
 
Procedure CatchPng(pngfilename.s)
  *
Buffer AllocateMemory(idunno_100500bytes)
  
PngSize ExtractWhatEverWayPngFromZipToBuffer(some_parameters)
  
res CatchImage(#PB_Any, *Buffer, PngSize)
  
ProcedureReturn res
EndProcedure
 
png 
CatchPng("imagefromzip.png")
Debug png
 
DataSection
  zipStart
:
  
IncludeBinary "data.zip"
  
zipEnd:
EndDataSection 


barsunduk 10.03.2015 03:47

Ответ: Распаковка из архива-ресурса мимо файла
 
похоже, в пурике это делается только через файл. ну, можно сохранять его во временную папку.
PHP код:

как прикрутить архив к ресурсам EXE
barsunduk © 2015
UseZipPacker
()
архив с ресурсами
Enumeration
  
#Pack
EndEnumeration

прочитать текстовый файл из архива
Procedure
.s unzipTxt(filename.s)
  
res.""
  
Size #False
  
If ExaminePack(#Pack)
    
While NextPackEntry(#Pack)
      
If PackEntryName(#Pack) = filename
        
Size PackEntrySize(#Pack, #PB_Packer_UncompressedSize)
        
*Buffer AllocateMemory(Size)
        
Size UncompressPackMemory(#Pack, *Buffer, Size, filename)
        
res PeekS(*BufferSize#PB_UTF8)
      
EndIf
    
Wend
  
EndIf
  
ProcedureReturn res
EndProcedure

прочитать картинку из архива
Procedure unzipSprite
(filename.s)
  
res #False
  
Size #False
  
If ExaminePack(#Pack)
    
While NextPackEntry(#Pack)
      
If PackEntryName(#Pack) = filename
        
Size PackEntrySize(#Pack, #PB_Packer_UncompressedSize)
        
*Buffer AllocateMemory(Size)
        
Size UncompressPackMemory(#Pack, *Buffer, Size, filename)
        
res CatchSprite(#PB_Any, *Buffer, #PB_Sprite_AlphaBlending)
      
EndIf
    
Wend
  
EndIf
  
ProcedureReturn res
EndProcedure

примеры использования:
Procedure onCreate()
  ; 
создать файл архива и открыть его для загрузки из него ресурсов
  fn
.GetTemporaryDirectory() + "temparjfile"
  
If CreateFile(0fn)
    
WriteData(0, ?zipData, ?zipEnd - ?zipData)
    
CloseFile(0)
  Else
    
MessageRequester("ERROR""Не удаётся сохранить файл" Chr(13) + fn)
    
End
  
EndIf
  If 
OpenPack(#Pack, fn, #PB_PackerPlugin_Zip)
    
;
  Else
    
MessageRequester("ERROR""Не удаётся прочитать файл" Chr(13) + fn)
    
End
  
EndIf
  ; 
считываем атлас спрайтов
  strAtlas 
unzipTxt("atlas.atlas")
  ; 
считываем карту уровней
  strLevels 
unzipTxt("levels.txt")
  ; 
инициализация системы спрайтов и мыши
  InitSprite
()
  
InitMouse()
  
InitSound()
  ; 
создаём экран внутри нашего окна размером с основной десктоп
  dskt_cnt 
ExamineDesktops()
  
scr OpenWindowedScreen(WindowID(#Window), 0, 0, DesktopWidth(0), DesktopHeight(0), 0, 0, 0)
  
активируем мышь
  ReleaseMouse
(#True)
  
читаем картинки-спрайты из архива
  sprBg 
unzipSprite("bg.jpg")
  
sprAtlas unzipSprite("atlas.png")
  ; 
фильтры для спрайтов
  SpriteQuality
(#PB_Sprite_BilinearFiltering)
  
закрыть файл архива
  ClosePack
(#Pack)
EndProcedure

DataSection
  zipData
:
  
IncludeBinary "data/data.zip"
  
zipEnd:
EndDataSection 


Пётр 11.03.2015 23:51

Ответ: Распаковка из архива-ресурса мимо файла
 
Цитата:

Сообщение от barsunduk (Сообщение 293974)
похоже, в пурике это делается только через файл.

В справке можно найти функции AddPackMemory(), CompressMemory(), UncompressMemory() и UncompressPackMemory()

Можно также написать свою реализацию архива. http://purebasic.mybb.ru/viewtopic.php?id=210

barsunduk 12.03.2015 19:42

Ответ: Распаковка из архива-ресурса мимо файла
 
Пётр, спасибо за информацию и ссылки.
но я изучил справку и проверил на практике. работа с атласами файлов осуществляется исключительно при работе с файлами. создавать собственный архиватор с атласом запакованных ресурсов желания нет. ибо пакую их именно затем, что на выходе получается архив с этой самой картой. а она то мне и нужна.
так что продолжу использовать свой вариант. пара секунд при загрузке не такая уж и глобальная потеря.

Maxus 19.03.2015 11:54

Ответ: Распаковка из архива-ресурса мимо файла
 
Есть варианты не прибегая к файлам. Копайте в перехват WinAPI

impersonalis 19.03.2015 13:49

Ответ: Распаковка из архива-ресурса мимо файла
 
ОМГ!!! Максус - ты где пропадал?!!!

Maxus 19.03.2015 13:51

Ответ: Распаковка из архива-ресурса мимо файла
 
Работал, детей воспитывал.


Часовой пояс GMT +4, время: 16:12.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Перевод: zCarot