ああ削除しちゃったか、せっかくだから解析結果だけ張っておこう
dim data,65535
dim rt,65535 ;√aの切り捨て
dim remind,65535 ;aとの差
a=0
*main
cls
button "圧縮",*conpress
button "解凍",*dispress
button "終了",*owari
stop
*conpress
cls
dialog "*",16,"すべてのファイル"
exist refstr
if strsize=-1:mes "error":stop
notesel sqrdata
noteadd getpath(refstr,11)
rep=strsize/4 ;必ず4の倍数らしい
repeat rep ;圧縮は√aの整数部分と、それとaとの差を保存する
bload refstr,data(cnt),65535,cnt*65535 ;なんだか変
if data(cnt)<0 {
rt(cnt)=int(-sqrt(-data(cnt)))
remind(cnt)=-data(cnt)-powf(rt(cnt),2)
}
if data(cnt)>0 {
rt(cnt)=int( sqrt( data(cnt)))
remind(cnt)= data(cnt)-powf(rt(cnt),2)
}
if data(cnt)=0 {
rt(cnt)=0
remind(cnt)=0
}
noteadd str(rt(cnt)),,0
noteadd str(remind(cnt)),,0
loop
notesave getpath(refstr,1)+".sqr"
noteunsel
sqrdata=0
mes "圧縮しました。"
button "OK",*main
stop
*dispress
cls
notesel sqrdata
dialog "sqr",16,"sqr圧縮ファイル"
if strsize=-1:mes "error":stop
noteload refstr
noteget filename
bsave filename,a
repeat (notemax-1)/2 ;解凍は√aの整数部分の自乗に、それとの差を合計する
noteget srt,cnt*2+1
noteget sremind,cnt*2+2
rt(cnt)=int(srt)
remind(cnt)=int(sremind)
if rt(cnt)<0 : data(cnt)=-(powf(rt(cnt),2)+remind(cnt))
if rt(cnt)>0 : data(cnt)= (powf(rt(cnt),2)+remind(cnt))
if rt(cnt)=0 : data(cnt)=0
bsave filename,data(cnt),4,cnt*4
loop
noteunsel
sqrdata=0
mes "解凍しました。"
button "OK",*main
stop
*owari
end
実動作部分だけ抜き取り簡素化したが動作は未確認。
こうしてみると、変なところがすぐわかる。
手法自体に問題ないが圧縮方法というよりIshに近い気がする。
そうすると、これで有効に圧縮出来るのならデータも特殊であろう。