Q&A

  • HextoBin 도움말만으론 응용을 어찌해야할지..
굳이 소스를 적자면 아래와 같아요. 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;
0  COMMENTS