굳이 소스를 적자면 아래와 같아요. Contents 는 내용을 담고 있는(....4E415641502E5678442C2061.....과같은 Hex분해값) String 전역변수구요, 나머지는
아래 소스에서 쉽게 뭔지 보이실겁니다. (물론 초보라 정리가 엉망입니다만 orz)
문제는, 이런 방법을 써서 일단 원하는..결과는.. 얻었으나, 수행속도가 현저히 떨어지기에, Hex값을 Binary파일로 저장하는 최적화된 방법이 필요해요.
보시다시피 딱보면 느리게 생겼지 않습니까--;
도움말을 열심히 "정독"에 정독을 거듭하여도 최적화된 방법이 떠오르질 않네요. 여러분들께서 쓰시는 방법이 궁금합니다.
현재 최대한 짜낸 저장 알고리즘 : 엄청나게 느려서 그렇지 뭐 결국 저장은 됩니다.약 70초-_-소요
procedure Hex2Bin;
var
Texta, Buffer : PChar;
CHKready:Tfilestream;
before:String;
i: integer;
begin
with form1 do begin
CHKReady:=Tfilestream.Create(SaveD.FileName,fmCreate ,fmShareDenyWrite );
try
before:=contents;
Texta := PChar(before);
GetMem(Buffer, 2);
for i:= 0 to length(contents) div 2 - 1 do begin
FillChar(Buffer^, 2, #0);
HexToBin(Pchar(before), Buffer, 2);
Delete(before,1,2);
Application.ProcessMessages;
Label1.Caption:=inttostr(i) + '/'+ inttostr(length(contents) div 2 - 1);
CHKReady.WriteBuffer(buffer^,sizeof(buffer^));
end;
finally
FreeMem(Buffer, 2);
chkready.Free;
end;
end;
end;
초기 InttoHex의 용법을 보여, 위 소스까지 도달하는데 사용된 "여는"소스 : 약 1초 이하 소요
procedure HexedOpen;
var
i : integer;
F : TFileStream;
b : Byte;
value : array of byte;
begin
F := TFileStream.Create( extractfilepath(application.ExeName)+ '\scenario.chk' ,fmOpenReadWrite , fmShareDenyNone );
try
with form1 do begin
contents:= '';
f.Seek(0,soFromBeginning );
for i:=0 to f.Size -1 do begin
f.Readbuffer( b, sizeof(byte));
contents := contents+inttohex(b, 2);
application.processmessages;
end;
memo1.Lines.Text:=contents;
setlength( value, 4);
f.Seek( 1,soFromBeginning );
for i:= 0 to 3 do begin
f.WriteBuffer( value[i], sizeof(byte));
end;
end;
finally
f.free;
deletefile(extractfilepath(application.ExeName)+ 'scenario.chk');
end;
end;
// 답변쓰신분이 없어서 몇자 적을께요
///////////////////////////////////////////////////////
문제점
1. 빈번한 GetMem과 FreeMem 사용
2. 마찬가지로 Application.ProcessMessages 빈번한 사용
3. 빈번한 Label1.Caption :=> 변동
해결방안
1. GetMem, FreeMem등은 한번에 사용하자
2. Application.ProcessMessages 사용을 최소화 하자.
3. 2와 상동
/////////////////////////////////////////////////////////////////
주안점
1. HEX String 데이타는 일정한다 (즉, 중간에 Space값 또는
리턴값등이 없다)
/////////////////////////////////////////////////////////////////
Hextobin으로 한번으로 된다. 그럼에도 불구하고 나누어서 한다함은
진행사항을 보고자 함이다. 그러나 과연 필요할까?
참고로 펜티엄600에서 백만건(저장 데이타 1M바이트)을 처리하는데
0.1초 걸림
한번에 하는방법
procedure Hex2Bin;
begin
With TMemoryStream.Create do
begin
SetSize(Length(Contents)div 2);
HextoBin(pchar(Contents), Memory, Length(Contents)div 2);
SaveToFile(SaveD.FileName);
Free;
end;
end;