// ビット単位でデータ操作 by kerupani129
#module "kerupanium_bit"
#defcfunc bit_power int _p1
p=1
repeat _p1
p*2
loop
return p
#defcfunc bit_mid_local int _p1,int _p2,int _p3
index=_p2
if index=-1 : index=8-_p3
return (_p1>>index)&(bit_power(_p3)-1)
#deffunc bit_shift var _p1,var _p2,int _p3,int _p4
len=_p4
if varptr(_p1)=varptr(_p2) { // 変数が同じだったら別の変数で処理してからやる
e=""
bit_shift e,_p2,_p3,_p4
memset _p1,0,len,0
memcpy _p1,e,_p4,0,0
} else {
shift=abs(_p3)\8
shift_byte=abs(_p3)/8
dim d
memexpand _p1,len
memset _p1,0,len,0
memcpy _p1,_p2,len,0,0
if _p3>0 {
if shift_byte!0 {
memcpy _p1,_p1,len-shift_byte,shift_byte,0 // メモリブロックの再確保した
memset _p1,0,shift_byte,0
}
if shift!0 {
repeat len
c=len-cnt-1
a=bit_mid_local(peek(_p1,c),-1,8-shift)
if c!0 : b=bit_mid_local(peek(_p1,c-1),0,shift) : else : b=0
d(cnt)=b*bit_power(8-shift)+a
;dialog "a="+a+",b="+b+",あれ="+d(cnt)
loop
repeat len
c=len-cnt-1
poke _p1,c,d(cnt)
loop
}
}
if _p3<0 {
if shift_byte!0 {
memcpy _p1,_p1,len-shift_byte,0,shift_byte // メモリブロックの再確保した
memset _p1,0,shift_byte,len-shift_byte
}
if shift!0 {
repeat len
c=cnt
a=bit_mid_local(peek(_p1,c),0,8-shift)
if c!(len-1) : b=bit_mid_local(peek(_p1,c+1),-1,shift) : else : b=0
d(cnt)=a*bit_power(shift)+b
;dialog "a="+a+",b="+b+",あれ="+d(cnt)
loop
repeat len
c=cnt
poke _p1,c,d(cnt)
loop
}
}
}
return
#deffunc bit_and var _p1,var _p2,var _p3,int _p4,int _p5,int _p6
; 変数が同じかどうかの処理してない
ands=_p4\8
ands_byte=_p4/8
len=ands_byte : if ands!0 : len+
memexpand _p1,len
memset _p1,0,len,0
if ands_byte!0 {
repeat ands_byte
c=_p5-cnt-1
c2=_p6-cnt-1
c3=len-cnt-1
poke _p1,c3,peek(_p2,c)&peek(_p3,c2)
loop
}
if ands!0 {
c=_p5-ands_byte-1
c2=_p6-ands_byte-1
c3=len-ands_byte-1
poke _p1,c3,bit_mid_local(peek(_p2,c),0,ands)&bit_mid_local(peek(_p3,c2),0,ands)
}
return
#deffunc bit_or var _p1,var _p2,int _p3,int _p4,int _p5
; まだ作ってない
return
#deffunc bit_xor var _p1,var _p2,int _p3,int _p4,int _p5
; まだ作ってない
return
#deffunc bit_mid var _p1,var _p2,int _p3,int _p4,int _p5
// データの一部をビット単位で抜き出す
// p1=変数 : 結果を入れる変数
// p2=変数 : もとのデータが入った変数
// p3=0~ : 取出し始めのインデックス1 (バイト単位)
// p4=0~7 : 取出し始めのインデックス2 (ビット単位)
// p5=0~ : 取出すビット数
// 右向きにp3バイト行ったところから左向きにp4ビットの所を取り出し初めにする
; 変数が同じかどうかの処理してない
; まだ完成してない
bytes=_p5/8 : if (_p5\8)!0 : bytes+
buf=""
memexpand buf,bytes
memcpy buf,_p2,bytes,0,_p3-bytes
bit_shift buf,buf,_p4,bytes
memexpand buf2,bytes
;bit_write buf2,
bit_and buf,buf2,_p4,bytes,bytes
;
return
// っていうか、メモリ何バイトか「HSPだと取得できねぇ」って書いたけど、
// 取得できたとしても文字列で勝手にNULL入ったりするから
// どっちみちユーザー側が指定できるようにして正解だったな…。
#global
ああ、自分もこんなの作ったことありました。
バイナリファイル扱おうとか思うと、ビット操作モジュールは欲しくなりますよね。
GIF解析頑張ってください。
Cookiesさんもですか!!
はい。とくにGIFはビット単位でデータ詰めまくりなんでビット単位の操作できるのがほしかったんで自作し始めました。
頑張ります!ありがとうございます!