谷歌 brotli 解压缩简易版

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

一,库源码:

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

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

登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...