hinekure.net が http://hspdev-wiki.net/ から自動クローリングした結果を表示しています。画像やリソースなどのリンクが切れています。予めご了承ください。 |
HSPで外部ファイルを扱うにはプラグインを利用することによりあらゆる画像ファイルをロード・セーブすることができるが、これには外部プラグイン(DLL)が必要になってくる。
このページではプラグインを一切使わずにHSP側でファイルのロード・セーブ・またはバイナリ操作をするためのモジュールを開発するためのものとなっています。
始点コードからの差を利用した方法 <<開発中>>
+ Open
- vinaryload -- バイナリファイルの読み込み
- p1 : ファイルパス
- p2 : バイナリの内容が代入される変数 NULL文字を含んだデータ
- binaryget --バイナリの取得
- p1: バイナリ変数
- p2 : バイナリの内容が代入される変数 NULL文字を含んだデータ
- p3: オフセット(-1) ※-1を指定した場合 前回の取得開始位置 + 前回取得した文字数 の位置が設定されます
- p4: 取得するbyte数
- p5: 読み込みタイプ(0) (0=文字列 1=数値[10進数int] 1=16進数[str] 3=10進数[str])
- p6:オプション(0) (0=なし 1=逆さまから読み込む)
+ ソース binary.hsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 - | | | - | | | ! - | - | | - | | | | | | | | | | | | | | | | | | - | | | ! | - | ! | ! - | | | ! - | - | ! - | | | | | | ! - | | | | | | | | ! - | | | | | | | ! - | | | | | | | ! - | ! - | ! - | ! - | ! - | | | ! - | | | !#module "binary" //バイナリファイルの読み込み #deffunc binaryload str p1, var p2, int p3 //ファイルがあるかないか調べる exist p1:if strsize=-1:return 0 binary_size=strsize //バイナリ全体のサイズを保持 //全体読み込み or 一部読み込み if (p3=0)|(p3=-1){ sdim p2,binary_size bload p1,p2,binary_size //p1で指定された変数に代入 }else{ sdim p2,p3 bload p1,p2,p3 binary_size=p3 //読み込んだバイナリ全体のサイズを保持 } return 1 //バイナリの取得 // p1: バイナリ変数 // p2: 始点となるコード (""が指定された場合最初から) // p3: オフセット(-1) ※-1を指定した場合 前回の取得開始位置 + 前回取得した文字数 の位置が設定されます // p4: 取得するbyte数 // p5: 読み込みタイプ(0) (0=文字列 1=数値[10進数int] 1=16進数[str] 3=10進数[str]) // p6:オプション(0) (0=なし 1=逆さまから読み込む) #defcfunc binaryget var p1, str p2, int p3, int p4, int p5,int p6 //始点コードが代入されているか if p2!""{ //前回と同じ始点コードかどうか(高速化目的) if p2=binary_offsetstr{ c3=binary_offset //前回のオフセット値を代入 c2=binary_offsetsize //前回のオフセットのサイズを代入 }else{ //コードを16bitに変換 s2=p2:s3=0:sdim c1 repeat getstr s1,s2,s3,' ' if s1="":s6=cnt:break c1+=strf("%c",int("$"+s1)) //始点コードを代入 s3+=strsize s4=cnt+1 loop c2=s4 //取得したコードのサイズを返す //バイナリ全体から読み取り開始位置を検索 s2=0 //見つけたかどうかのフラグ repeat binary_size-c2 sdim s1,64 memcpy s1,p1,c2,0,cnt //始点コードと検索文字が同じ場合実行 if c1=s1{ c3=c2+cnt //読み込み位置を指定 s2=1 break } loop if s2=0{ return -1 //見つからない場合エラー } binary_offsetnext=0 //次のオフセットの初期化 } }else{ c1="" //始点コードNULL c2=0 //始点コードのサイズ NULL c3=0 //最初から読み込むようにする } //読み込み if p3<0{ c5=binary_offsetnext //(前回の取得開始位置 + 前回取得した文字数) }else{ c5=p3 //通常のオフセット } sdim c4,p4 //読み込むサイズだけサイズを空ける memcpy c4,p1,p4,0,c3+c5 //オフセット分だけずらした位置を取得する c3=取得開始位置 //逆さまに入れ替える if p6=1{ sdim s2,p4 memcpy s2,c4,p4,0,0 //取得したデータを代入 sdim c4,p4 //取得したデータをクリア repeat p4 memcpy c4,s2,1,cnt,p4-cnt-1 loop } //数値として返す if p5=1{ sdim s2,p4 memcpy s2,c4,p4,0,0 //取得したデータを代入 sdim c4,p4 //c4をクリア repeat p4 s1=strf("%02X",peek(s2,cnt)) c4+s1 loop c4=int("$"+c4) //数値型に変換 } //16進数として返す if p5=2{ sdim s2,p4 memcpy s2,c4,p4,0,0 //取得したデータを代入 sdim c4,p4 //取得したデータをクリア repeat p4 s1=strf("%02X",peek(s2,cnt)) c4+s1 loop } //10進数として返す if p5=3{ sdim s2,p4 memcpy s2,c4,p4,0,0 //取得したデータを代入 sdim c4,p4 //取得したデータをクリア repeat p4 s1=strf("%D",peek(s2,cnt)) c4+s1 loop } //代入 binary_offset=c3 //読み込み開始位置を保持 binary_offsetstr=p2 //始点コード文字列を保持 binary_offsetsize=c2 //始点コードの文字数を保持 binary_offsetnext=p4+c5 //次に読み込むための位置 を代入 (文字数) return c4 //binarygetのp3パラメータの値で設定される値にp1の数を加算する #deffunc binary_next_through int p1 binary_offsetnext+p1 return #global //ファイル識別 #if 1 type="" dialog "bmp;*.jpg;*.gif;*.png",16,"画像ファイル" //ファイル選択ダイアログ if stat=0:end //キャンセルされた場合終了 binaryload refstr,bin,128 //先頭部分のみバイナリファイルの読み込み imgpass=refstr //パスの保持 if binaryget(bin,"",0,3)="GIF"{ type="GIF" } if binaryget(bin,"FF EO",2,4)="JFIF"{ type="JPG" } if binaryget(bin,"",0,8,2)="89504E470D0A1A0A"{ type="PNG" } if binaryget(bin,"",0,2)="BM"{ type="BMP" } #endif //ファイルの詳細 #if 1 binaryload imgpass,bin mes "拡張子\t"+type switch type case "GIF" mes "タイプ\t"+binaryget(bin,"",0,3) mes "バージョン\t"+ binaryget(bin,"47 49 46",0,3) mes "幅\t"+ binaryget(bin,"47 49 46",-1,2,1,1)+" px" mes "高さ\t"+ binaryget(bin,"47 49 46",-1,2,1,1)+" px" binary_next_through 1+3+1+3 mes "透明色\t"+ binaryget(bin,"47 49 46",-1,1,1,0) swbreak case "JPG" mes "タイプ\t"+binaryget(bin,"FF EO",2,4) binary_next_through 1 mes "幅\t"+ binaryget(bin,"FF C0",3,2,1)+" px" mes "高さ\t"+ binaryget(bin,"FF C0",-1,2,1)+" px" swbreak case "PNG" mes "タイプ\t"+binaryget(bin,"",1,3) mes "ファイルサイズ\t"+binaryget(bin,"",-1,3) mes "幅\t"+ binaryget(bin,"49 48 44 52",0,4,1)+" px" mes "高さ\t"+ binaryget(bin,"49 48 44 52",-1,4,1)+" px" swbreak case "BMP" mes "タイプ\t"+type mes "ファイルサイズ\t"+binaryget(bin,"",2,4,1,1)+" byte" if binaryget(bin,"",11,4,2)="00000028"{ mes "ヘッダ\tWindows BitMap" mes "高さ\t"+ binaryget(bin,"00 00 00 28",0,4,1,1)+" px" mes "高さ\t"+ binaryget(bin,"00 00 00 28",-1,4,1,1)+" px" } if binaryget(bin,"",11,4,2)="0000000C"{ mes "ヘッダ\tOS/2 BitMap" mes "高さ\t"+ binaryget(bin,"00 00 00 0C",0,2,1,1)+" px" mes "高さ\t"+ binaryget(bin,"00 00 00 0C",-1,2,1,1)+" px" } mes "" swbreak swend #endif stop
NULL文字(00)で分割し配列変数に区分けする方法 <<開発終了>>
+ Open
- vinaryload
- バイナリファイルの読み込み
- p1 : ファイルパス
- p2 : 配列変数 バイナリデータがブロックに分けられて代入されます
- binarysave
- バイナリファイルに保存
- p1 : 読み込むファイル名
- p2 : バイナリデータが入った配列変数
- binaryget
- バイナリのブロックを取得
- p1 : バイナリのデータが入った配列変数
- p2 : 先頭から数えたブロック番号
- binaryset
- バイナリの指定したブロックの値を変更
- p1 : バイナリのデータが入った配列変数
- p2 : 先頭から数えたブロック番号
- p3 : 代入する値
- binaryadd
- バイナリファイルのに新しいブロックを追加
- p1 : バイナリのデータが入った配列変数
- p2 : 先頭から数えたブロック番号
- p3 : 代入する値
- binaryspsel
- p1 : 値を取得するための基点を設定
- p2 : バイナリ配列変数
- p3 : 16進数文字列(null) null = ファイル先頭 ※format : "FF FF"
- ※ この命令はp2に入力した値(FF FF等)をファイルの先頭から探し出し、見つけた場合そこを基点としてbinaryspget関数binaryspset命令にて基点を中心にバイナリ操作をする。
- ※ binarysp はブロックを要素として区別していません
- binaryspget
- p1 : 基点を0として文字列を取得する
- p2 : 取得する位置
- p3 : 取得する文字数
- binaryspset
- 基点を0として文字列を設定する
- p1 : バイナリ配列変数
- p2 : 代入する位置
- p3 : 設定する文字数
- p4 : アスキー文字列
- ※ binarysp はブロックを要素として区別していません
- binaryvinarylist
- バイナリデータのブロック要素一覧をリストに代入
- p1 : 代入先変数
- p2 : バイナリ配列変数
+ ソース binary_old.hsp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 - | | - | | ! - | ! - | | ! - | | !#module "binary" //----------------------------------------------------------------------- //バイナリファイルの読み込み // p1 : 読み込むファイル名 // p2 : 代入する変数 // p3 : 読み込むサイズ(-1) #deffunc binaryload str p1, array p2, int p3 exist p1:if strsize=-1:return 0 //ファイルが存在しない場合0を返す if (p3=0)|(p3=-1)|(strsize<p3){ sdim s1,strsize //文字列に変換 bload p1,s1,-1 //メモリの範囲内だけを読み込み }else{ sdim s1,p3 //文字列に変換 bload p1,s1,p3 //サイズ指定で読み込む } s2=strsize sdim p2,s2 //初期化 //コード00を改行コードに変換 repeat s2-1 if 0=peek(s1,cnt){ poke s1,cnt,13 } loop //行ごとに変数に割り当て notesel s1 repeat notemax noteget p2(cnt),cnt loop sdim s3 //メモリ初期化 noteunsel //対象バッファを元に戻す return s2 //ファイルサイズを返す //----------------------------------------------------------------------- //バイナリファイルに保存 // p1 : 読み込むファイル名 // p2 : バイナリデータが入った配列変数 #deffunc binarysave str p1,array p2 sdim s1 //初期化 bsave p1,s1 //ファイルの初期化 s3=0 //位置の記憶 //ブロックに分けて保存(NULL文字付加) foreach p2 s1 = p2(cnt) //poke s1,strlen(s1),0 bsave p1,s1,strlen(s1),ad s3+=strlen(s1)+1 loop return 1 //----------------------------------------------------------------------- //バイナリの指定したブロックを取得 // p1 : バイナリのデータが入った配列変数 // p2 : 先頭から数えたブロック番号 // p3 : 取得位置(0) // p4 : 取得する文字数(-1) #defcfunc binaryget array p1, int p2, int p3, int p4 if length(p1)<=p2:return -1 //取得できない場合-1が返る if (p3=-1)|(p3=0):s1=0:else:s1=p3 if (p4=-1)|(p4=0):s2=strlen(p1(cnt)):else:s2=p4 return strmid(p1(p2),s1,s2) //----------------------------------------------------------------------- //バイナリの指定したブロックの値を変更 // p1 : バイナリのデータが入った配列変数 // p2 : 先頭から数えたブロック番号 // p3 : 代入する値 #deffunc binaryset array p1, int p2, str p3 if length(p1)<=p2:return -1 //取得できない場合-1が返る p1(p2)=p3 //代入 return 1 //----------------------------------------------------------------------- //バイナリの指定したブロックに値を追加 //p1 : バイナリのデータが入った配列変数 //p2 : 追加する位置(先頭から数えたブロック番号) //p3 : 代入する値 #deffunc binaryadd array p1, int p2, str p3 //配列変数をnoteselで読める形にする sdim s1 foreach p1 s1+=p1(cnt)+"\n" loop //追加 notesel s1 noteadd p3,p2 //配列変数に戻す repeat notemax noteget p1(cnt),cnt loop noteunsel //対象バッファを元に戻す return 1 //----------------------------------------------------------------------- //値を取得するための基点を設定 // p1 : バイナリ配列変数 // p2 : 16進数文字列(null) null = ファイル先頭 ※format : "FF FF" // // ※ この命令はp2に入力した値(FF FF等)をファイルの先頭から探し出し、見つ // けた場合そこを基点としてbinaryspget関数binaryspset命令にて基点を中心に // バイナリ操作をする。 // ※ binarysp はブロックを要素として区別していません #deffunc binaryspsel array p1, str p2 if p2="":binary_point=0:return 0 //p1に何も入力されていない場合ファイル先頭から読むようにする //p2の16進数をアスキーに変換 s7=0 s8=p2 s2=0 sdim s6,256 repeat getstr s5,s8,s7,' ':s7+strsize if s5="" :break poke s6,cnt,int("$"+s5) s2+ loop //noteselで読める形にする sdim s1 foreach p1 s1+=p1(cnt)+"\n" loop s4=0 //取得したかどうかのフラグ //全体を1byteずつループ repeat strlen(s1) s3=strmid(s1,cnt,s2) repeat strlen(s3) if 13=peek(s3,cnt){ poke s3,cnt,"" //改行(終端コード)含まれていた場合削除 } loop if s3=s6:binary_point=cnt:s4=1:break //開始位置決定 loop if s4=0:return -1 //取得できなかった sdim s1 //メモリクリア return binary_point //----------------------------------------------------------------------- //基点を0として文字列を取得する // p1 : バイナリ配列変数 // p2 : 取得する位置 // p3 : 取得する文字数 // ※ binarysp はブロックを要素として区別していません #defcfunc binaryspget array p1, int p2, int p3 //noteselで読める形にする sdim s1 foreach p1 s1+=p1(cnt)+"\n" loop s2=strmid(s1,binary_point+p2-1,p3) repeat strlen(s2) if 13=peek(s2,cnt){ poke s2,cnt,"" //改行(終端コード)含まれていた場合削除 } loop sdim s1 //メモリクリア return s2 //----------------------------------------------------------------------- //基点を0として文字列を設定する // p1 : バイナリ配列変数 // p2 : 代入する位置 // p3 : 設定する文字数 // p4 : アスキー文字列 // ※ binarysp はブロックを要素として区別していません #deffunc binaryspset array p1, int p2, int p3, str p4 //p4の文字列のサイズを取得() s2=p4:if (p3=0)|(p3>strlen(p4)):s4=strlen(p4):else:s4=p3 //文字列を指定したサイズに収める s2=strmid(s2,0,s4) //noteselで読める形にする sdim s1 foreach p1 s1+=p1(cnt)+"\n" loop //文字列上書き代入 repeat s4 s3=strmid(s1,binary_point+p2+cnt-1,1) if 13=peek(s3,0):continue s3=strmid(s2,cnt,1) poke s1,binary_point+p2+cnt-1,peek(s3,0) loop //行ごとに変数に割り当て notesel s1 repeat notemax noteget p1(cnt),cnt loop noteunsel foreach p1 //mes p1(cnt) loop sdim s1 //メモリクリア return strlen(s2) //----------------------------------------------------------------------- //バイナリデータをリスト変数に代入 // p1 : 代入先変数 // p2 : バイナリ配列変数 #deffunc vinarylist var p1, array p2 sdim p1 foreach p2 p1+=p2(cnt)+"\n" loop return strlen(p1) #global
画像のサイズを取得
31 30 30というデータが書き込まれています。
64 00 00 00というデータが書き込まれています。(バイトオーダーにより異なる)
64 00 00 00の場合においてですが、00というNULL文字でブロックは区切られているのでしょうか? もしそうだとすれば、6400 00 00 という3つのブロックができるとおもうのですが違うのでしょうか?-- As 2006-12-03 (日) 06:54:33