BHX 5.6 now with great encoding
Posted: 12 Apr 2015 23:21
When I create my program bhx it always encode binary data using 16 hexadecimal characters, that is write out 2 bytes for 1 byte.
For reduce the output I recommend create a cabinet with the file using lzx compression and then apply bhx.
But today I replaced the default hexadecimal encode with a encoding based on the encoding ZeroMQ Base-85 that uses 85 printable characters.
The result is awesome, this saves more bytes than base 16 encoding, and even more than base 64 encoding.
For example, the current bhx.exe size is: 12288 bytes.
Using the previous default hexadecimal it produced a script file (that includes the decoder) with size:
flat(hex): 26921 bytes
cab(hex): 11288 bytes
And now using the new 85 encoding produces a script file (that includes the decoder) with size:
flat(85): 17957 bytes
cab(85): 8182 bytes.
This is the script for rebuild bhx 5.6 :
build_bhx.cmd
For reduce the output I recommend create a cabinet with the file using lzx compression and then apply bhx.
But today I replaced the default hexadecimal encode with a encoding based on the encoding ZeroMQ Base-85 that uses 85 printable characters.
The result is awesome, this saves more bytes than base 16 encoding, and even more than base 64 encoding.
For example, the current bhx.exe size is: 12288 bytes.
Using the previous default hexadecimal it produced a script file (that includes the decoder) with size:
flat(hex): 26921 bytes
cab(hex): 11288 bytes
And now using the new 85 encoding produces a script file (that includes the decoder) with size:
flat(85): 17957 bytes
cab(85): 8182 bytes.
BHX v5.6
Encode a binary file in a batch script for rebuild it.
By default, the generated batch script name is mybin.cmd.
Is recommended convert your file in a cabinet
with compression, created with this command line:
Makecab /d compressiontype=lzx file file.cab
and use the generated cabinet as source.
This can save many bytes in the output script.
BHX source [/ne] [/o:out] [/y]
source Binary to encode.
/ne If the source file is a cabinet, not write code
for expand it.
/o:out out is the output filename instead of mybin.cmd.
/y Overwrite the output file.
/hex Encode binary data using 16 hexadecimal characters.
The default encoder uses 85 printable characters.
BHX /author
display the author of the program.
This is the script for rebuild bhx 5.6 :
build_bhx.cmd
Code: Select all
@Echo Off
SetLocal EnableExtensions
Call :Rebuild
If ErrorLevel 1 Echo Rebuild failed.
Goto :Eof
:Rebuild
Rem Script made using BHX 5.6 { consolesoft.com/p/bhx }
SetLocal EnableExtensions EnableDelayedExpansion
Set "bin=bhx.cab"
Set /A "size=4688"
For %%# In (
"bhx.exe"
"!bin!" "!bin!.da" "!bin!.tmp"
) Do If Exist "%%#" (Del /A /F /Q "%%#" >Nul 2>&1
If ErrorLevel 1 Exit /B 1 )
Set "fsrc=%~f0"
Findstr /B /N ":+res:!bin!:" "!fsrc!" >"!bin!.tmp"
(Set /P "inioff="
Set /P "endoff=") <"!bin!.tmp"
For /F "delims=:" %%# In ("!inioff!") Do Set "inioff=%%#"
For /F "delims=:" %%# In ("!endoff!") Do Set "endoff=%%#"
Set ".=ado="adodb.stream""
Set ".=!.! :set a=createobject(ado) :a.type=1 :a.open"
Set ".=!.! :set u=createobject(ado) :u.type=2 :u.open"
Set ".=!.! :set fs=createobject("scripting.filesystemobject")"
Set ".=!.! :set s=fs.opentextfile("!fsrc!",1,0,0)"
Set ".=!.! :e="0123456789abcdefghijklmnopqrstuvwxyzABCDEF"
Set ".=!.!GHIJKLMNOPQRSTUVWXYZ.-:+=^^`/*?&<>()[]{}~,$#"
Set ".=!.!" :max=!size! :wri=0 :n=array(0,0,0,0,0)"
Set ".=!.! :for i=1 to !inioff! step 1 :s.readline :next"
Set ".=!.! :do while i<!endoff! :d=replace(s.readline," ","")"
Set ".=!.! :for j=1 to len(d) step 5 :num85=mid(d,j,5)"
Set ".=!.! :v=0 :for k=1 to len(num85) step 1"
Set ".=!.! :v=v*85+instr(1,e,mid(num85,k,1))-1 :next"
Set ".=!.! :n(1)=Fix(v/16777216) :v=v-n(1)*16777216"
Set ".=!.! :n(2)=Fix(v/65536) :v=v-n(2)*65536"
Set ".=!.! :n(3)=Fix(v/256) :n(4)=v-n(3)*256"
Set ".=!.! :for m=1 to 4 step 1 :if (wri < max) then"
Set ".=!.! :u.writetext chrb(n(m)) :wri=wri+1 :end if :next"
Set ".=!.! :next :i=i+1 :loop"
Set ".=!.! :u.position=2 :u.copyto a :u.close :set u=nothing"
Set ".=!.! :a.savetofile "!bin!",2 :a.close :set a=nothing"
Set ".=!.! :s.close :set s=nothing :set fs=nothing"
Echo !.!>"!bin!.da"
Set "ret=1"
Cscript.exe /B /E:vbs "!bin!.da" >Nul
For %%# In ("!bin!") Do If "%%~z#"=="!size!" Set "ret=0"
If "0"=="!ret!" Expand.exe -r "!bin!" -F:* . >Nul
If ErrorLevel 1 Set "ret=1"
Del /A /F "!bin!" "!bin!.da" "!bin!.tmp" >Nul
Exit /B !ret!
:+res:bhx.cab:
o&BzG00000p.A:d00000ec2UI000000,5A50rr9100000l&Wh`0rrim05axM
000000053GgJJJ~vRy0swQ4+^KCANO1qgX*ty.l-0$URo001i0u]d&-zud0f
-<<e$`?Qg83G?R.y^e~Je~dIEXE]Z4n(h6pYsVvV?q9p}/NAw]Vp]m0KCfwQ
pW^snUILblayLQW:q?YRDjH[OMop-WRZpYyTXkL6]k8][I-1)o1]}b8&eOcA
?[=`l{?,h:o(Issn#SdZ{$yoh[ZFG=Q#ol5)YL^.Z$(Qs1gx5UC9:&lf#hJh
/QcS}1y2oA`rmgn>#$tmXN?<BtEvDY&WDYU?}[.m0dU4H+)TOH/ao(+=*nHT
*9&9Patsx>P^*y(t&rxlBoMXzqj5KnTQMByJIc~Ly)2qu28{kZ,h60:pE/]J
Oe[9uuBn>`US~K:Zlos$aW<C7ck4Xh.69$p5Hsm.YP2l:oD~Rj)k/ogSl]~F
Yj)Lm4$$4.Mi5^=YFY6E410qi+p<eUb.8OOW:xL#Y:yUcl`nVd]6YZZ4`5A[
zXA&$IUBnH9ApjHD5-*~Lp-texo}?=hV+.S7l8N7(I`<61NBovWtkj(?:B9^
&[A}#+>Woi=N-UrWOe7zG1p:mTMrUZefLC1TV15f3AOl-n}gbc-cU]AzqozI
.Oy&VJs&onVez?/TtNeig7,y{p?}~jgX1pyCv7mZxMT$?L>.9Y<6aS?7TrmQ
j(fbLjBx(D:Ug#J*)=2L<2li+Dk=z`>QvJ6($zgYo67:x*DG-L?7WmUeb(/B
0~hP#vfa1kb]BI]+O?DFl,2co9#q)1:h=cXKlp,{3<J0srJsO[`&SsZps+<^
927vFWn725F:Ri>-oiE,o^bzh`-$8G<d1o}jQ*0(Y.ZpfV72nBPOM<rq$ck^
([PUlfJkL5oKDa+ju(9>E=:~LIp)9<5J}I7pCyVW~y<6io2e,,2xL3tb(iT-
i5&wK:s-vlxd/.YAuKUE1]5kE:8N(H6vzuA:mvH}MY2(C[&g92bu9kZ^6,2(
ATQs?[3snVUgU]AT7D-&FRifCX9OL.3dwZdeL-uLF/X9>(]}d4c9S&L/yocb
4XVejL)hi,-62-z{h:F8hl-WPzLJUlLuo),wQac4>tenasB`kJs0o]yaKd6m
mJM&s:dv1/Z2=8cBQ(ur-:1Zs>GnTuWYWiLM{W5x1VXa7T?c9E>v9X65]uIh
cHGGMzGKP:.5Y)R}E^)URY^+0i~x#q9je}Q-SklG4p0^0aU]O422h(ho`=kH
wfOh]-mb/52f`#lLI1RWhFK<${u?*#ox]6KBDC`7w}S7}eY-ySz2x=YwZhQu
0^nUg:W}D3G)RaUO?G.zdR{8r*3Y?$^C?+SD8ky7how{M2t$7h(&=Z~[DlL:
k?L}=zp2=SF9[zkol(AGOw,k&<BB6(+Py}T^Xe,+(V01ZIG-]=h,AKcW&T.h
HEKCj=L+r&D[E:d=,IJl<66j*3HAc8BjosK]E{8L<Ium2lBgRx5c?1.YDOO.
?Hisz7#j?P8X,90~oVCW8,zE/>dk~=yAk0rnGg?^x)0yW2P-8{XYwA^yJ{$)
DVfqP+B0ymc:qo1NDldq~Hqg&,1~{XMrqojQkoO)0M<+t~gjy{3t:G4G^M)T
0sR7]2IKZsKjI9NAq4,6P1qT=AF&9z/-wqCXO-?yq.-}VNYk##?s`p??.YH:
x2lXkz84OEObb>38Q}cTUbJ3<W.5p1&1bjy)55TVwqUb]N&a]G]nB8UWd,+X
~7IHcIsaCWXnFFLXwkfE5i6IXgJ?0M7$}g0*&zp9v1#oJ17w>13v-QdFvLO-
Ff7(Czk2d*J3nmGtcrm&y-g<V4=z[SyWbj9xy7*lMVYx*>]WCON#c5e(Wba(
hPdBHVu875qpv&hB?N}NV-cO$ZkpW:pjaAvoC/1x{}TOn:eRp{U<50tosiSI
TQCIL>`J1}Ep-Y.qoM=~+9Z{~Wa{tuz14$)}l$M)^hV]AS&Ix4sl8FB*lMaP
3^)3<Pfvbj4QeBD^6<$:=$l1}p7p}{c.*^M0PPULpwF?gh-uE~6`qvLBYW/e
YumXgsUj?l8TK6o+/xtng6nG1E108Z-yz33Zl}RLPWdA3TUwK)Ixj,PvArE0
>&2]~OP3[F}5rzk5V9{o8~i+>I~:6T)kh$VZ6u}OqcIQIfhW5<A/<5Kd3-Z6
=R+NM[k:&22m1kUaH[G{CxDn:tcciBrnLHVPetws4xrC$M?av]P{}FcI:WdY
/hJ22>x(OqC8]X^gYsLD(]IzVEFhy/IBUm~uT:*ytZFt:y5l74k:zIcrRUs7
}oA~QasE4]`MlS+q0C$HwtciIuGND=ser8$SosoX.N+cHqAO^S.6eNLIL,c<
[x9#7(9.[(JSy94LTPM<am3thYlju9-v<f^hRBN8z)re>>}1eDDOv^n-+R{:
P7Lp3BfGlGGzm^ekj/7d2OXX$*#gWM9F$d4Jd7Y,4?bJg9`4^HXpgN=B{5M)
D]I{gH~6XvH)]W^xHsqv]cqV3P>9,y3?5gu(GJRBo}S6+TK${uxCI.ik{=<}
VvB]up7NdbQC.L:f-sVQ(iP2opTYH0Z&PxpT]0I-G2-A0m>Gdd.#zAw[eWzF
gauBUTPhqn{cSh/ZkA9U,jbc/0o(:{dOPfQ}=upakEJox[<*31HLC(EF-gnV
m2Oy*s$a9AG<g#zqIsvfbP4DZH-,av{.vzQUp0U7cx#E~xYZ1pUP[Vs[[:5]
O#S.UB5.o$2u=OrhNs$k)e=o#B/jlj?6g8U8<**c2AE~}D$hrc?Te{4M]=cT
]{#9y}Z$U(LIB3r>Q[#9]8pSW2/{W)0n:UNRgk~``fa+OIk:[a)a7+b0E}c>
v:Atv02u{EZXSHR*T>muxXT(9FH.{6i[zNB`J}X9(m-B+Aq^y~l)LAdDb}u$
j,-JVrWuh0~(0HZ^3qYFPKl&:r($8UR#TCtS(qi*{8y)65:Vce9jjzO1oY>x
7WM<=x24{/}5w/ihYTz=H}Uo.QJyemJt=DUshn)7pY268M329d9iFP2?X]{~
<5ZzY9evytnrZOu`.r5lrZ1gkdT~)+d49ZVGFe$Cn3yd{(d9,$/GT&d/nEwi
c~scFK(Vaiog4$$MMdObX4vc7GvQMI)eA.a1L&Fk+b?bRG[k&T47#+}ZTBIt
DzC}6a2CEa=.fspVy$<-BRapn`Hz:#i>}A2r>hNB>VMIknm2Nm&q80Jd`/RU
L48LV^HVuvY#B:dZ*qet,jf*:WX(B+T5/PZ6A6Qqz~KG~T1v{p1O>]By$WpN
yIW)vC/Nv[aT#gtMYxUjN/LC1J&VduDNCZ:~+(bR=uRt1YpQ]WpWenylh<Ew
ETuDAgMThk8e6n1n1f1)M]cL?(JG&*d&xnMMcrYuD8aRz=2w#qUbM+dnO/~]
FbrewTxv~hX8}(s{TDx3oU62cvxp1+}K,/Ub)+UeLSg5/fHI5YsR&d>wGWuH
}8FXrH:Q{CdZ}[<4r]^9tu{>S{BHV4j*Mi-j+d?Wo:HgR([-Mh2Y*YajOBK0
B&.+3MUd,EUPs7wI1Q6$MhNqxy$DaeCjyZSlVd[*EifRNBBCARNmHNTvYvVv
5ar:R+eFF=tJrwla9SgPXnKsr){kt<Ju4PM)=b{B{F9D=p4p>YYi*#/I-v.~
AnL8isncsL=hQ$Lvk,OYkrYyqQ21B.*pgMZ/`=`pl~19~]ExzyRW^^^vW&t1
2Y)>`3zY{6L$v[Wc*8Q./`+Nf.]e(G3Ky(#-4DlC({3JAi3ZtXh5]HB5O&1P
5Y6-U7.Xdh)[)jg6G.icncRv{367=xik`L-TK)Kcs$*{-AA#n,jRFIL-ypz,
+Tpe.eo7#}R<9XGO5J[:h6K$iBpjPUg66#RYqO3yzQ38iTJ{jDaDJqdvWB1g
uTSdno]muUJ10(,SH6w>(>v3oTw2J#DmM,4fS6fAe/u9p]4mPl(g3Bp:Al44
^8YmS[}2uC3gT.[T]Hb4:Z)L`iCH^skQsaVacuBG(>Qv#rSR+Qh#CK`FIcRe
EibB{=Omp6a[neh1i?X,x?(4yF1xK0:S-p41zR:qb:>^^Urtq[=VhoFBct.V
)=:M.abd`VU{T+oNB4Uf6LE[UF?O*`Vz{lj-Zixo^N9`rQ{]znp+sdegN~so
0Ni8ddvGm&dw*].gpx4+=pTTvxjAthe:v9o>s^bLadBwI5gJ#o&c~Em?M`vw
F>Jnck-en2zVqX(dJ$,5*e>pI?9G*yupk-RB`[xzLu*jztZd)CvU5&sjUg[^
21TXtpl9Lk-nuCG8:Y/Z--1y/ORh^GRxvrxpqp3JWesf{Z3]?2,i29dL/YI)
{zT/Qr{Bwx>+`{RSuOpcW`Darudm`Z0$#<b6EC1Zg17pJoW/tZN:xetKwOyo
]{aoQ5rWEUFHQ2>*fHZ$[(}QE]0tA&>yd+:<p]PFI8BYFvB{.Ursnsgw*K?F
L[rn:r/a`#<,-TARBq<*sX=jRV(0wgQP5FpWQH0PLhq5Kd)0hql+Z90Fupg.
9V9B^TJ:t`wTWg=/<jEnN:*hT1A[VO]qU/c&k~3fM::p.7nGB1Id}i*jS:fm
{OIXmB+24vLh9Ydq<R-CM/S/KBj8pm?[tsMF.L~=JvFJvpZVJr*,<qF~<lZo
6pb:&`1*${YElmJL9fx-HKCi5F2u)LKj+pV.I>6[/dM8O/{Lt.3dosc>rq9p
t)eY2E+Cmec~6^Roz6hV^PJa)fmoeSI]F3Zb9~QkG`PKDuxriz^GkVb6CuWs
Sq-bmRcDB9G:VL?j>[G6jiYd5.uq$W.[-7HvTe(`ZTkh5nTlq[hc#e0n:bP9
WsQkP4tc#CoTQN+i[}]e7]v<5O3~U/D[hu.iWU,k6}5oiQTBOxDnBaDKvSH#
kcmxtOYzHavv}Z?8yP->F/y,}N]q?tTIwpZ<<g}uXKL)t9i+qKI2sfJGTj[j
7<2D6Q]{]RHqNyn3}Ii-i<$/L`&f&~t>k9(j36Yn}~wG]owEn~rz$g1r}/PE
vHrPeEvHvd379e,~lD,1UO<o=oZCD,lB^T~hKgx9Xq0`FPg#dEp`kTVMX<FU
0~c(Qjw1Kzq3j.hpmZou.:i0nT<EzvOmjWUnw#uSZl#DpHKL6n2ajXW=HKwW
JRUr>Eo$&0L=C>+`B79lb5g<TvL/*OURT.MS6/alJR.an{nR>?a[nITROkHq
:gN~ZFn3:nwOU+Dey)W$oMdlCSqPKQDh<dyV1[z1upi+#sWEzig~`:[QYS>R
Lg^E]2>nM`rLU*Cf/7,xV{8B7-ooRlISpmt]5#-YCDzxN4LiO9p$g#Gr6DKP
6)DguCsFFRH?B96s#qF(h`M&]zeoS22<<0?hF`FpOg78X62Tz,U*2B5oN6nJ
ts3#WvskPRSL&5O}6Ku71gKrXive,a.oA2MMG-AxOYTNcnU4n[Zm}2(az0j8
n:^in`sdV2hs>]*+~:Au*`qkL5s45j4$2l7}GZ$xU~6GSTe7x4:u*Va]n1?,
r7>V&.ZcdGG/Ubb^Zv)C7^y2T(qedT6kX{LbeEewt^?Pdtxw.vrdl<qw4(r8
yIS/OSe>iyLOGhgg7ardm~1N</}v>IE){)c(Gl4n-~)$C:O<X4]paSxiP[Tn
/<w~NtJV6`MwT:(MQcbx)GKzdW{mnoA[YVy+f[zTJFE<fn0aOkqAX4IwI7P2
d&`FHL~.z/gVG{,C6EaxJ`R{9he}~OUZ)0zVJUvGNKZqxXP4#~YeWWJU17j3
l*)zba2jwy9$/a42Jyyalhwv<0R+6]r(&#Z5qF2q1kGxT?0N`qju{eu.NO*a
X}/BV-YwF&)~60ImVF(eMW2BWJf,n^J#H5dE,8UpT1,JI5xd:oxayG}JIn`6
u-{4yEQ593L{XP$QgHgY(9ErT+]/Cs+z&C/wyHRfn$eTNYR=NCSazzKPL74B
O-Twh~VsDRgw*t~&x~zhLk9:E{sW>zh(O*jD-CDs
:+res:bhx.cab: