ZipToVar 과 UnzipToVar 명령어는 입력변수의 데이터를 zip 포맷으로 압축하거나 zip 포맷의 압축데이터에서 특정데이터를 추출하는 명령어입니다. 이 명령어를 추가한 이유는 스마트집 같은 간편한 압축관련 스크립트가 있지만 파일을 거치지 않고 메모리에서 압축하거나 압축해제해서 쓸 수 있는 필요성이 생겨서입니다.

 

이 명령어를 추가하는데 사용한 zip unzip c++ 소스의 출처입니다.  많은 감사를 표합니다.

http://www.info-zip.org/

http://www.codeproject.com/Articles/7530/Zip-Utils-clean-elegant-simple-C-Win

 

 

ZipToVar , OutZipVar, OutZipSize, srcVar, srcSize [, insideName, password]

 

zip 포멧으로 압축합니다.
압축된 데이터를 파일로 저장하려면 파일오브젝트의 RawWrite() 함수를 사용해야 합니다.

 

[결과값]
ErrorLevel = 0 : 압축 성공
ErrorLevel = 1 : 소스데이터가 존재하지 않거나 ClipBoard 변수가 지정된 경우
ErrorLevel = 2 : 압축데이터 생성 실패
ErrorLevel = 3 : 압축데이터 추가 실패

 

[변수]

insideName : 압축데이터 내에 설정될 데이터 식별명(압축파일내의 파일이름)

password : 패스워드

 

[참고]

ZipToVar 명령어는 아직 기존 압축데이터에 새 데이터 추가를 지원 하지 않습니다. 추후 업데이트 예정입니다.

 

 


 

 

UnzipToVar , OutUnzipVar, OutUnzipSize, srcZipVar, srcZipSize [, insideName, password]

 

zip 포멧으로 압축된 데이터를 해제합니다.

 

[결과값]
ErrorLevel = 0 : 압축해제 성공
ErrorLevel = 1 : 소스데이터가 존재하지 않거나 ClipBoard 변수가 지정된 경우
ErrorLevel = 2 : 압축데이터 열기 실패(또는 패스워드 오류)
ErrorLevel = 3 : 압축데이터 내에서 'insideName' 식별명을 가진 데이터 찾기 실패
ErrorLevel = 4 : 압축해제 실패

 

[변수]

insideName : 압축데이터에서 해제할 데이터의 식별명(압축파일내의 파일이름)

password : 패스워드

 

[주의]

해결되지 않은 문제점이 있습니다. 50바이트 내의 특정 데이터를 압축한 경우 압축 해제시에 오류가 발생하는 경우가 있습니다. 원인을 찾는데 시간이 걸릴것 같습니다.

 

 


 

Test.ahk 파일을 다운로드한  'Ahk+ 전용 AutoHotkey.exe 파일'  위에 드래그해서 실행하세요.

ZipToVar테스트_소스.zip

 

 

 

<테스트 스크립트>

 

F1::
  imageFile = sample.bmp
  FileRead, srcData, *c %imageFile% ;*c 옵션은 파일을 그대로 읽어오는 옵션
  FileGetSize, srcSize, %imageFile%
  ;이미지 데이터를 압축
  ZipToVar, zipData, zipSize, srcData, srcSize, abcd.bmp
  ;이진데이터를 BASE64 문자열 변환
  BinToHex, base64Str, zipData, zipSize, *Base64
  ;텍스트 파일로 저장
  FileAppend, % base64Str, sample_base64.txt
  MsgBox, 압축이미지데이터를 BASE64 문자열로 변환 후 텍스트 파일로 저장완료!
return


F2::
  ;F1 키를 눌러 만들어진 BASE64 문자열 텍스트파일 내용을 복사해서 붙여넣었습니다.
  imageData = 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

  ;BASE64 문자열을 압축 이진데이터로 변환
  HexToBin, binData, binSize, imageData, *Base64
  ;압축데이터에서 이미지데이터 추출
  UnzipToVar, memBmp, memBmpSize, binData, binSize, abcd.bmp
  hBitmap := CreateHBitmapFromVar(memBmp)
  
  ;윈도우에 이미지 출력
  Gui, Add, Picture, w100 h100 hwndhwndPic 0xE
  SetImage(hwndPic, hBitmap)
  Gui, Show
return

 

GuiClose:
ExitApp


;----------------------------------------------------------------------------------
;윈도우에 비트맵 출력
SetImage(hwnd, hBitmap)
{
  SendMessage, 0x172, 0x0, hBitmap,, ahk_id %hwnd%
  E := ErrorLevel
  DllCall("DeleteObject", Ptr,E)
  return E
}

 

;----------------------------------------------------------------------------------
;메모리에 로딩된 BMP파일을 읽어 HBitmap핸들로 반환
CreateHBitmapFromVar(ByRef bmpVar)
{
  WinGet, hwnd, ID, ahk_class Progman
  hDC := DllCall("USER32\GetDC", Ptr,hwnd, Ptr)
  hBMP := DllCall( "CreateDIBitmap", UInt,hDC, UInt,(bmiHAddr:=&bmpVar+14)
       ,UInt,(CBM_INIT:=4), UInt,&bmpVar+NumGet(&bmpVar,10), UInt,&bmpVar+14, UInt,(DIB_PAL_COLORS:=1) )
  DllCall("ReleaseDC", Ptr,hwnd, Ptr,hDC, Uint)
  return hBMP
}

 

 

Posted by 와이로
,