如何將*.smg的Binary檔讀出修改後,再另存為一個i新*.smg檔呢?? |
答題得分者是:st33chen
|
dick299
一般會員 發表:1 回覆:3 積分:0 註冊:2008-10-22 發送簡訊給我 |
各位大大你們好:
我現有一問題想麻煩各位幫忙一下 我有一檔案 , 格式是 smg 檔 , 這是噴墨機產生後匯出的檔案 我想把此檔的內容讀出至 TEdit 變數中 , 經修改其中部份資料後 舉例如下 : 即將 7 6 B 4 T 0 2 0 0 1 F L 8 A 6 K I 0 0 0 0 0 0 0 0 0 0 0 2 2 2 2 改成 7 6 B 4 T 0 2 0 0 1 F L 8 A M B J 2 7 5 A 1 8 2 1 L 2 7 A 2 B F 再存成另一個 smg 檔 , 並匯入噴墨機中噴印條碼 以下是我查本站的相關資料後所寫的程式 , 已可讀出了, 但所佔的位元變大了(原為171byte 變為 401 byte) , 而且存檔後的資料排列也變了, 不知如何才能存成跟原始檔一樣呢??? 煩請各位幫忙 , 謝謝!! [PS] 附上我欲修改之噴墨機匯出的 smg 檔, [code delphi] unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, ExtCtrls, StdCtrls, DB, ADODB, DateUtils, StrUtils; type TForm1 = class(TForm) Panel1: TPanel; OpenDialog1: TOpenDialog; Open_Edit: TEdit; SaveDialog1: TSaveDialog; Save_Edit: TEdit; Save_Btn: TButton; Load_Btn: TButton; SFsize_Edit: TEdit; SFsize_Name: TLabel; Sor_Edit: TEdit; Sor_Name: TLabel; Upd_Name: TLabel; Upd_Edit: TEdit; UFsize_Name: TLabel; UFsize_Edit: TEdit; procedure Upd_EditExit(Sender: TObject); procedure Open_EditDblClick(Sender: TObject); procedure Save_EditDblClick(Sender: TObject); procedure Save_BtnClick(Sender: TObject); procedure Load_BtnClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Upd_EditExit(Sender: TObject); begin UFsize_Edit.Text := IntToStr(length(Upd_Edit.Text)); end; procedure TForm1.Open_EditDblClick(Sender: TObject); begin OpenDialog1.Filter := 'Smg File(*.smg)|*.smg'; if OpenDialog1.Execute then Open_Edit.Text := OpenDialog1.FileName; end; procedure TForm1.Save_EditDblClick(Sender: TObject); begin SaveDialog1.Filter := 'Smg File(*.smg)|*.smg'; if SaveDialog1.Execute then begin if LowerCase(RightStr(SaveDialog1.FileName,4)) = '.smg' then Save_Edit.Text := SaveDialog1.FileName else Save_Edit.Text := SaveDialog1.FileName '.smg'; end; end; procedure TForm1.Load_BtnClick(Sender: TObject); var I:Integer; F:TMemoryStream; B:Char; L:TStringList; begin if FileExists(Open_Edit.Text) then begin F := TMemoryStream.Create; F.LoadFromFile(Open_Edit.Text); SFsize_Edit.Text := IntToStr(F.Size); try L := TStringList.Create; try I := 0; while F.Position < F.Size do begin F.Position := I; if F.Read(B, SizeOf(B)) = SizeOf(B) then begin L.Add(Trim(B)); end; Inc(I); end; Sor_Edit.Text := L.Text; Upd_Edit.Text := L.Text; UFsize_Edit.Text := IntToStr(length(Upd_Edit.Text)); finally FreeAndNil(L); end; finally FreeAndNil(F); end; end else ShowMessage('檔案不存在, 讀檔失敗!!'); end; procedure TForm1.Save_BtnClick(Sender: TObject); var fs : TFileStream; begin if not ((Length(Trim(Save_Edit.Text)) = 0) or (Trim(Save_Edit.Text) = 'Double Clicks To Select Saved File')) then begin fs := TFileStream.Create(Save_Edit.Text, fmCreate or fmOpenWrite); fs.Write(PChar(Upd_Edit.Text)^, Length(Upd_Edit.Text)) end else ShowMessage('請輸入欲儲存的檔名, 存檔失敗!!'); end; end. [/code]
附加檔案:48fe9e1d7dc8c_4.smg
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
|
dick299
一般會員 發表:1 回覆:3 積分:0 註冊:2008-10-22 發送簡訊給我 |
|
st33chen
尊榮會員 發表:15 回覆:591 積分:1201 註冊:2005-09-30 發送簡訊給我 |
請試一下: var Form1: TForm1; F, G:TMemoryStream; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var ii : integer; astr : byte; begin F := TMemoryStream.Create; F.LoadFromFile('c:\test\48fe9e1d7dc8c_4.smg'); F.Position := 96; edit1.text :=''; for ii := 1 to 32 do begin if F.Read(astr, 1)=1 then begin edit1.text := edit1.text chr(astr); end; F.Read(astr, 1); end; edit2.text := edit1.text; // 假設改完後為 edit2.text := '76B4T02001FL8AMBJ275A1821L27A2BF'; end; procedure TForm1.Button2Click(Sender: TObject);
var ii : integer; astr : string; bstr : char; begin // 因為 f.write 實際是做 insert 動作而非 replace , 故只能用一個新的 memorystream 來存改後資料 G := TMemoryStream.Create; g.Position:=0; f.Position:=0; G.CopyFrom(f, 96); astr := edit2.text; for ii := 0 to 31 do begin bstr := astr[ii]; G.write(bstr, 1); bstr := chr(0); G.write(bstr, 1); end; f.Position := 159; G.CopyFrom(f, 11); g.SaveToFile('c:\test\48fe9e1d7dc8c_4out.smg'); f.free; g.free; end;
------
IS IT WHAT IT IS 我是 李慕白 請倒著唸. 又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦); 都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
編輯記錄
st33chen 重新編輯於 2008-10-22 18:25:05, 註解 無‧
|
christie
資深會員 發表:30 回覆:299 積分:475 註冊:2005-03-25 發送簡訊給我 |
Hi:
若您的.smg是單純文字檔, 可以用TStringList. 試試看 ===================引 用 dick299 文 章=================== 大大你好: 謝謝大大提供的方法, 我一開始就是用此方法來測試經由HexEditor手動修改過的smg檔是否可噴印, 確實是沒問題的. 不過,這無法提供給現場工作人員來使用, 而且這還需要經由現場輸入一些相關資料後, 再以組合成的條碼資料 , 去修改smg檔中的條碼部份的資料 然後匯入噴墨機來噴印, 所以才會想寫一程式來處理. 謝謝大大的回應~ ===================引 用 st33chen 文 章=================== 您好 用一個 HEXEDITOR 去改不是比較快?
------
What do we live for if not to make life less difficult for each other? |
dick299
一般會員 發表:1 回覆:3 積分:0 註冊:2008-10-22 發送簡訊給我 |
大大你好:
這smg檔應該不是單純文字檔, 謝謝大大回應~~ ===================引 用 christie 文 章=================== Hi: 若您的.smg是單純文字檔, 可以用TStringList. 試試看 ===================引 用 dick299 文 章=================== 大大你好: 謝謝大大提供的方法, 我一開始就是用此方法來測試經由HexEditor手動修改過的smg檔是否可噴印, 確實是沒問題的. 不過,這無法提供給現場工作人員來使用, 而且這還需要經由現場輸入一些相關資料後, 再以組合成的條碼資料 , 去修改smg檔中的條碼部份的資料 然後匯入噴墨機來噴印, 所以才會想寫一程式來處理. 謝謝大大的回應~ ===================引 用 st33chen 文 章=================== 您好 用一個 HEXEDITOR 去改不是比較快? |
dick299
一般會員 發表:1 回覆:3 積分:0 註冊:2008-10-22 發送簡訊給我 |
謝謝大大
經測試後,產生的檔案除在讀寫碼位需再修改外, 是正確的, 謝謝大大的幫忙~~~ ===================引 用 st33chen 文 章=================== 請試一下: var Form1: TForm1; F, G:TMemoryStream; ? implementation ? {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var ii : integer; astr : byte; begin F := TMemoryStream.Create; F.LoadFromFile('c:\test\48fe9e1d7dc8c_4.smg'); F.Position := 96; edit1.text :=''; for ii := 1 to 32 do begin if F.Read(astr, 1)=1 then begin edit1.text := edit1.text chr(astr); end; F.Read(astr, 1); end; edit2.text := edit1.text; // 假設改完後為 edit2.text := '76B4T02001FL8AMBJ275A1821L27A2BF'; end; ? procedure TForm1.Button2Click(Sender: TObject);
var ii : integer; astr : string; bstr : char; begin G := TMemoryStream.Create; g.Position:=0; f.Position:=0; G.CopyFrom(f, 96); astr := edit2.text; for ii := 0 to 31 do begin bstr := astr[ii]; G.write(bstr, 1); bstr := chr(0); G.write(bstr, 1); end; f.Position := 159; G.CopyFrom(f, 11); g.SaveToFile('c:\test\48fe9e1d7dc8c_4out.smg'); f.free; g.free; end;
編輯記錄
dick299 重新編輯於 2008-10-22 18:08:11, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |