[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
GetAsyncKeyState(x)比kbhit()强多了,只是觉得好像有点延迟,按键反应不是很快,360会拦住

TOP

回复 23# CrLf
多了4个字符,转码比为16/17,省掉%6的存储,根据字母频率打表,为何不直接转成二进制,根据二进制组合频率构建二进制动态码表。那样理论上会达到原始文件的rar压缩体积。

TOP

本帖最后由 happy886rr 于 2016-10-7 10:46 编辑

回复 25# aa77dd@163.com
我只是针对base64的压缩,因为base64一般只传输比较小的文件,对于小文件可以尝试直接转为0和1来深度压缩。对于超过1M的大文件已经没有必要用base64压缩了,直接上rar。

还有这里无需直接读取位,base64已经按位转码了一次,base64的每个字符都是6位bit,我们已经得到可bit的结构。只需要统计01000000或者其他什么的01101000001的位组合,哪个出现的多,就把哪个用一个码替换,然后设置一个非可打印字符开关码,遇到这个码,就开启非可打印字符开关编码。只是这个流程我需要用C语言构思一下。

TOP

本帖最后由 happy886rr 于 2016-10-7 10:55 编辑

回复 27# aa77dd@163.com
转化成二进制,就只需要移位了,连正则都省了。这里需要对文件流lines做个自身比对
比如line1=1010111111110000000000001,再复制个line2=line1,让line2在line1下方不断移动
比如此时line2=1010111111110000000000001
他们的重合区域就出现↑↑↑↑↑       ↑↑↑↑↑↑↑↑↑↑
这样不断移位,找重合区域来设置新码表

TOP

回复 29# aa77dd@163.com
不过对于批处理中的base64,应该用几行简短的批处理去实现base64的压缩还原。就那你getkey的base64码来说,那些代码中只有A最多,只需替换A即可。

TOP

回复 23# CrLf
那个js对单纯的A压缩的不够好,还是你的那条数据,例如 576 字节长的编码js版压缩为345 字节,但我用批能压缩到243字节,远超rar和7z
Base64压缩机
  1. @echo off
  2. REM 原始数据
  3. set "LINE=TVqQAAMAAAAEAAAA//8AALgAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAgAAAAA4fug4AtAnNIbgBTM0hVGhpcyBwcm9ncmFtIGNhbm5vdCBiZSBydW4gaW4gRE9TIG1vZGUuDQ0KJAAAAAAAAABQRQAATAEFAJOHz1cAAAAAAAAAAOAADwMLAQI4AAwAAAAUAAAAAgAAIBIAAAAQAAAAIAAAAABAAAAQAAAAAgAABAAAAAEAAAAEAAAAAAAAAABgAAAABAAAUV0AAAMAAAAAACAAABAAAAAAEAAAEAAAAAAAABAAAAAAAAAAAAAAAABQAABAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAC50ZXh0AAAAFAoAAAAQAAAADAAAAAQAAAAAAAAAAAAAAAAAAGAAAGAuZGF0YQAAAEAAAAAAIAAA"
  4. REM 压缩数据
  5. setlocal enabledelayedexpansion
  6. for /l %%i in (1,1,10000) do (
  7. if "!LINE:~0,1!"=="A" (
  8. set/a i+=1
  9. ) else (
  10. if !i! neq 0 (
  11. set M=512
  12. for %%Z in (@,-,#,$,_,},{,],[,A) do (
  13.     if !i! geq !M! (
  14. set "S=!S!%%Z"
  15. set/a "i-=M"
  16. )
  17. set/a "M>>=1"
  18. )
  19. )
  20. if "!LINE!"=="" (echo !S!>压缩.txt&exit) else (set "S=!S!!LINE:~0,1!")
  21. )
  22. set "LINE=!LINE:~1!"
  23. )
复制代码
Base64解压机
  1. REM 解压数据
  2. set/p LINE=<压缩.txt
  3. setlocal enabledelayedexpansion
  4. set "Z=A"&(for %%Z in ([,],{,},_,$,#,-,@) do (set "Z=!Z!!Z!"&for %%S in (!Z!) do (set "LINE=!LINE:%%Z=%%S!")))&echo !LINE!>解压.txt
复制代码

TOP

回复 33# plp626
base64会增加一些数据,用6位来表示一个字节,也就是6x=8y。故信息量比为x/y=8/6=4/3,也就是体积涨到133%,所以只能从转码前压缩入手。

TOP

回复 36# codegay
批处理局限性太大,我采取的是用C语言来实现压缩,压缩好的数据用批处理解压,再用那个证书管理certutil变成二进制文件。
压缩费时费力,但解压批处理就能胜任。str=!str:*=*!,效率是很高的。

TOP

回复 39# CrLf
大师,如果只用可打印字符来压缩的话,压缩比始终上不去。即便再添加新的符号,都不可能比base64划算。只能去寻找重复的节点。

TOP

回复 41# 523066680
哈哈,原来是mod原理,数学无处不在。

TOP

本帖最后由 happy886rr 于 2016-10-7 23:26 编辑

回复 39# CrLf
大师,比如如下的数据:
  1. TVqQAAMAAAAEQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAAQAAMAAAA
复制代码
分别用@,-,#,$,_,},{,],[,.表示512个A、256个A、128个A、、、、、1个A,则化为:
  1. TVqQ[M]EQ[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]Q[M]
复制代码
然后继续迭代 用@,-,#,$,_,},{,],[,.表示512个、256个、128个、、、、、1个Q[M]则化为:
  1. TVq.E{]
复制代码
用:冒号表示标签切换。化为可解码的格式
  1. TVq.E{]:Q[M]:A
复制代码
如此就实现了用14个字符去表示108个字符的base64字符串。我发现没有任何算法有这个压缩率高。
我正在思考如何用批处理实现,当然用C实现起来会更容易,但是那样就得带个exe。

当然也许有可能产生歧义,不过只要加上层号即可。
如对字串AAAAAAAAAAAAAAAAAAEFAAABAAACAAADAAAEFAAAGAAAHHAAAAI压缩为
  1. }[EF.B.C.D.EF.G.HH]I:[.;1:A
复制代码
其中:[.;1中:[.表示要替换为的标签,分号;1表示只替换一级权签,也就是只替换.,之后的:A表示在上次替换完后再次替换所有权签为A。
基本可以实现可见字符内的最大压缩化。
2

评分人数

TOP

返回列表