全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1363
推到 Plurk!
推到 Facebook!

如何將*.smg的Binary檔讀出修改後,再另存為一個i新*.smg檔呢??

答題得分者是:st33chen
dick299
一般會員


發表:1
回覆:3
積分:0
註冊:2008-10-22

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-10-22 11:29:33 IP:59.125.xxx.xxx 訂閱
各位大大你們好:
我現有一問題想麻煩各位幫忙一下
我有一檔案 , 格式是 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
編輯記錄
dick299 重新編輯於 2008-10-22 12:21:29, 註解 無‧
dick299 重新編輯於 2008-10-22 12:22:04, 註解 無‧
dick299 重新編輯於 2008-10-22 13:39:50, 註解 無‧
dick299 重新編輯於 2008-10-22 14:21:35, 註解 無‧
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-10-22 14:32:58 IP:122.116.xxx.xxx 未訂閱
您好
用一個 HEXEDITOR 去改不是比較快?
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
dick299
一般會員


發表:1
回覆:3
積分:0
註冊:2008-10-22

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-10-22 14:57:47 IP:59.125.xxx.xxx 訂閱
大大你好:
謝謝大大提供的方法,
我一開始就是用此方法來測試經由HexEditor手動修改過的smg檔是否可噴印,
確實是沒問題的.

不過,這無法提供給現場工作人員來使用,
而且這還需要經由現場輸入一些相關資料後,
再以組合成的條碼資料 , 去修改smg檔中的條碼部份的資料
然後匯入噴墨機來噴印,
所以才會想寫一程式來處理.

謝謝大大的回應~
===================引 用 st33chen 文 章===================
您好
用一個 HEXEDITOR 去改不是比較快?
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-10-22 17:03:00 IP:122.116.xxx.xxx 未訂閱
請試一下:

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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-10-22 17:03:57 IP:122.117.xxx.xxx 未訂閱
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

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-10-22 17:42:09 IP:59.125.xxx.xxx 訂閱
大大你好:
這smg檔應該不是單純文字檔,
謝謝大大回應~~
===================引 用 christie 文 章===================
Hi:
若您的.smg是單純文字檔, 可以用TStringList.
試試看
===================引 用 dick299 文 章===================
大大你好:
謝謝大大提供的方法,
我一開始就是用此方法來測試經由HexEditor手動修改過的smg檔是否可噴印,
確實是沒問題的.

不過,這無法提供給現場工作人員來使用,
而且這還需要經由現場輸入一些相關資料後,
再以組合成的條碼資料 , 去修改smg檔中的條碼部份的資料
然後匯入噴墨機來噴印,
所以才會想寫一程式來處理.

謝謝大大的回應~
===================引 用 st33chen 文 章===================
您好
用一個 HEXEDITOR 去改不是比較快?
dick299
一般會員


發表:1
回覆:3
積分:0
註冊:2008-10-22

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-10-22 17:48:34 IP:59.125.xxx.xxx 訂閱
謝謝大大
經測試後,產生的檔案除在讀寫碼位需再修改外, 是正確的,
謝謝大大的幫忙~~~
===================引 用 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, 註解 無‧
系統時間:2024-05-07 21:18:12
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!