掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
バイナリデータの切り抜き保存 (ID:44309)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
過保護なサンプルを作ってみました。TEditでなくTMemoに出力します。 かなりごちゃごちゃしてますが、エラーチェックと表示を除くと実質的にはわずかです。 もしCutLengthが可変するなら、Bufferは動的配列を使うのが便利だと思います。 >切り抜いたものを別のバイナリデータとして保存 //このあとでEdit1.textを元にバイナリデータを作る バイナリデータはBufferにありますよね。読み込みと同じ要領でやっても簡単ですよ。 ヘルプはあまり上等ではありませんが、それでもよく読んだ方がいいです。 procedure TForm1.Button1Click(Sender: TObject); var FileName : String; ReadLength: Longint; I: Integer; Stream: TFileStream; DataOffset,CutLength : Integer; //切り抜き開始場所,切り抜く長さ Buffer: array of Byte; begin FileName :='test.dat'; DataOffset := 200; CutLength := 16; Setlength(Buffer, CutLength); Stream:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); try Memo1.Lines.Add(Format('Stream.Size=%d', [Stream.Size])); Memo1.Lines.Add(''); if DataOffset>(Stream.Size-1) then begin Memo1.Lines.Add(Format('※DataOffsetの位置がStream.Size-1を超過※ DataOffset=%d', [DataOffset])); end else begin if (DataOffset+CutLength)>Stream.Size then begin // エラーチェックならこちらだけでも十分 Memo1.Lines.Add(Format('※CutLengthの終端がStream.Sizeを超過※ DataOffset+CutLength=%d', [DataOffset+CutLength])); end; end; Stream.Seek(DataOffset, soBeginning); // Seekは(Stream.Size-1)を超過できてしまうことに注意 ReadLength:=Stream.Read(Buffer[0], Length(Buffer)); // 第1引数は「型なしパラメータ」、ちょっと特殊 if ReadLength<>Length(Buffer) then begin Memo1.Lines.Add(Format('※※CutLength分の読み取りに失敗※※ ReadLength=%d', [ReadLength])); end; for I:=0 to High(Buffer) do begin (* 16進数で画面に出力 *) Memo1.SelText:=Format('%.2x ', [Buffer[I]]); end; Memo1.Lines.Add(''); finally Stream.Free; end; //切り抜いたものを別のバイナリデータとして保存 FileName:=ChangeFileExt(FileName,'_Cut'+ExtractFileExt(FileName)); Stream:=TFileStream.Create(FileName, fmCreate); try ReadLength:=Stream.Write(Buffer[0], Length(Buffer)); finally Stream.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.