谷歌 brotli 解压缩简易版

By terrorist at 2022-02-05 • 0人收藏 • 316人看过

一,库源码:

namespace aaz.libbrotli{
	_dll := ..raw.loadDll($"~\lib\aaz\libbrotli\.res\libbrotli.dll",,"cdecl")

	decompress = function(str){
		var state = _dll.BrotliDecoderCreateInstanceP(0, 0, 0);
		
		var availableIn = {int value=#str};
		var nextIn = {ptr v = ..raw.buffer(str)}
		
		var ptr = ..raw.realloc(1)
	
		var result = 3/*_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT*/;	
		while(result == 3/*_BROTLI_DECODER_RESULT_NEEDS_MORE_OUTPUT*/){
			var availableOut = {int value=0};
			result = _dll.BrotliDecoderDecompressStream(
				state, 
				availableIn, nextIn,
				availableOut, 0,
				0
			);
			var buffer = _dll.BrotliDecoderTakeOutputP(state, availableOut)

			if(availableOut.value){
				ptr = ..raw.concat(ptr, buffer, availableOut.value)
			}
		}

		var ret;
		if(result == 1/*_BROTLI_DECODER_RESULT_SUCCESS*/ ){
			ret = ..raw.str(ptr) 
		}
		
		_dll.BrotliDecoderDestroyInstance(state);
		ptr = ..raw.realloc(0, ptr)
		
		return ret; 
	};	
}


二, 使用:

io.open()

import inet.whttp
import aaz.libbrotli;

var whttp = inet.whttp(,"HTTP://127.0.0.1:10083")
whttp.addHeaders = /**
accept-encoding: br
user-agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
**/

var html = whttp.get( "https://www.youtube.com/" )
if(html){
	var ret = aaz.libbrotli.decompress(html)
	if(ret){
		io.print(ret)	
	}
}


execute("pause")

三,参考资料:

1, 简易解压方法  https://github.com/google/brotli/blob/bbe5d72ba37b164c4e8e0d7baeb78a22aa849c38/python/_brotli.cc#L637


2, BrotliDecoderDecompressStream 函数用法  https://brotli.org/decode.html#a234

3, BrotliDecoderTakeOutput 函数用法 https://brotli.org/decode.html#a234


四, dll 编译方法:

1,    安装 Perl 

2, 下载 1.0.9 版本的源码并解压 https://github.com/google/brotli/archive/refs/tags/v1.0.9.zip

3, 下载编译脚本  winbro.bat  https://github.com/diovoemor/winbro 放入源码的目录,然后运行

4,  打开 VS 的命令行工具 x86 Native Tools Command Prompt 并切换到源码目录

5,  执行命令 nmake /f makefile.msvc

6, 等待编译 dll 完成


五, 总结:

BrotliDecoderDecompressStream  函数里面的参数 const uint8_t **   可用 

{ptr v = ..raw.buffer(str)}

表示

1 个回复 | 最后更新于 2022-02-01
2022-02-05   #1

新年第一贴,多谢分享,学习了。

登录后方可回帖

登 录
信息栏
公告:
私人站, 专注分享, 可在分享中适当提问, 但谢绝纯提问, 否则不再提醒一律删帖, 谢谢合作!



本站域名:HtmLayout.Cn
aardio可以快速开发上位机,本站主要记录了学习过程中遇到的问题和解决办法及aardio代码分享

这里主要专注于aardio学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.

Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
本 站 主 站:Stm32cube中文网
Sciter中文在线文档Sciter在线学习文档
空间赞助:才仁机械
Loading...