veretragna
Как писал, так и работает.
- Сообщения
- 140
- Репутация
- 10
Доброго вечера.
Сразу вопрос.
В описании функций _WinAPI_DecompressBuffer() и _WinAPI_CompressBuffer() указано, что они могут работать в том числе и с форматом $COMPRESSION_FORMAT_XPRESS_HUFF. Но на практике оказалось, что не совсем.
Если сжимать и распаковать данные с помощью формата $COMPRESSION_FORMAT_XPRESS (без _HUFF), данные распаковываются нормально. А если сжать и распаковать с помощью $COMPRESSION_FORMAT_XPRESS_HUFF, то распакованная строка оказывается заполненной нулями, @error выставляется в 10, а @extended - в C00000E8.
Собственно, почему $COMPRESSION_FORMAT_XPRESS_HUFF не работает, как надо?
Прошу помочь с определением проблемы, код внизу.
Или подскажите рабочую библиотечку для сильного сжатия данных прямо в памяти (типа LZMA), если есть актуальная версия.
Заранее спасибо.
UPD: Но ведь разобраться интереснее! :laugh:
Сразу вопрос.
В описании функций _WinAPI_DecompressBuffer() и _WinAPI_CompressBuffer() указано, что они могут работать в том числе и с форматом $COMPRESSION_FORMAT_XPRESS_HUFF. Но на практике оказалось, что не совсем.
Если сжимать и распаковать данные с помощью формата $COMPRESSION_FORMAT_XPRESS (без _HUFF), данные распаковываются нормально. А если сжать и распаковать с помощью $COMPRESSION_FORMAT_XPRESS_HUFF, то распакованная строка оказывается заполненной нулями, @error выставляется в 10, а @extended - в C00000E8.
Собственно, почему $COMPRESSION_FORMAT_XPRESS_HUFF не работает, как надо?
Прошу помочь с определением проблемы, код внизу.
Или подскажите рабочую библиотечку для сильного сжатия данных прямо в памяти (типа LZMA), если есть актуальная версия.
Заранее спасибо.
UPD: Но ведь разобраться интереснее! :laugh:
Код:
#include <APISysConstants.au3>
#include <WinAPISys.au3>
$data = "binbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbinbin"
$Ret = _DB_CompressData($data)
$Ret = _DB_DeCompressData($Ret)
MsgBox(0, "uncompressed data", $Ret)
Func _DB_CompressData($data)
Local $Size_O, $Size_C, $a_pBuffer[2], $ret[3]
$Size_O = BinaryLen($data)
$a_pBuffer[0] = _WinAPI_CreateBuffer($Size_O)
$a_pBuffer[1] = _WinAPI_CreateBuffer($Size_O)
DllStructSetData(DllStructCreate('byte[' & $Size_O & ']', $a_pBuffer[0]), 1, $data)
$Size_C = _WinAPI_CompressBuffer($a_pBuffer[0], $Size_O, $a_pBuffer[1], $Size_O, BitOR($COMPRESSION_FORMAT_XPRESS_HUFF, $COMPRESSION_ENGINE_MAXIMUM))
; сжимает нормально, бинарные данные в порядке
;$Size_C = _WinAPI_CompressBuffer($a_pBuffer[0], $Size_O, $a_pBuffer[1], $Size_O, BitOR($COMPRESSION_FORMAT_XPRESS, $COMPRESSION_ENGINE_MAXIMUM)) ; работает!
$ret[0] = DllStructGetData(DllStructCreate('byte[' & $Size_C & ']', $a_pBuffer[1]), 1)
$ret[1] = $Size_O
$ret[2] = $Size_C
_WinAPI_FreeMemory($a_pBuffer[0])
_WinAPI_FreeMemory($a_pBuffer[1])
Return $ret
EndFunc ;==>_CompressData
Func _DB_DeCompressData($data)
Local $Size_O, $Size_C, $BinData, $a_pBuffer[2], $ret
$Size_O = $data[1]
$Size_C = $data[2]
$BinData = $data[0]
$a_pBuffer[0] = _WinAPI_CreateBuffer($Size_O)
$a_pBuffer[1] = _WinAPI_CreateBuffer($Size_C)
DllStructSetData(DllStructCreate('byte[' & $Size_C & ']', $a_pBuffer[1]), 1, $BinData)
_WinAPI_DecompressBuffer($a_pBuffer[0], $Size_O, $a_pBuffer[1], $Size_C, $COMPRESSION_FORMAT_XPRESS_HUFF)
; не работает =( @error = 10, Hex(@extended) = c00000e8
;_WinAPI_DecompressBuffer($a_pBuffer[0], $Size_O, $a_pBuffer[1], $Size_C, $COMPRESSION_FORMAT_XPRESS) ; работает!
MsgBox(0, @error, Hex(@extended))
$Ret = BinaryToString(DllStructGetData(DllStructCreate('byte[' & $Size_O & ']', $a_pBuffer[0]), 1), 1)
_WinAPI_FreeMemory($a_pBuffer[0])
_WinAPI_FreeMemory($a_pBuffer[1])
Return $Ret
EndFunc ;==>_CompressData