⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bin2iso.pas

📁 用于CD/DVD烧录的Delphi源码,包括source和demo
💻 PAS
字号:
{-----------------------------------------------------------------------------
 Unit Name: Bin2ISO
 Author:    paul fisher
 Purpose:   Convert a BIN File to ISO (2048) file
 History:   First release (not tested)
-----------------------------------------------------------------------------}


unit Bin2ISO;

interface

uses SysUtils, Classes, CDBufferedStream, Resources;

const
   BIN2ISO_OK = 0;
   BIN2ISO_UNKNOWN = 1;
   BIN2ISO_NOT_RAW = 2;
   BIN2ISO_INVALID_MODE = 3;
   BIN2ISO_CANCELED = 4;
   BIN2ISO_NOFILEFOUND = 5;

   SYNCPATTERN = '00FFFFFFFFFFFFFFFFFFFF00';


type
   TProgressEvent = procedure(PercentDone: Integer; var Cancel: Boolean) of object;




type
   TBIN2ISO = class
   private
      FProgressEvent: TProgressEvent;
      FErrorString: string;
      FErrorCode: Integer;
      FBinFileName: string;
      FISOFileName: string;
      FBinStream: TCDBufferedStream;
      FISOStream: TFileStream;
      FSeek_Header: Integer;
      FSeek_ECC: Integer;
      FSector_Size: Integer;

      procedure SetBINFilename(Filename: string);
      procedure SetISOFilename(Filename: string);
      procedure AutoInitialize;
      procedure AutoDestroy;
      function CheckSYNCPattern: Boolean;
   public
      constructor Create;
      destructor Destroy; override;
      function ConvertFile: Integer;
   published
      property OnProgress: TProgressEvent read FProgressEvent write FProgressEvent;
      property BINFileName: string read FBinFileName write SetBINFilename;
      property ISOFileName: string read FISOFileName write SetISOFilename;
   end;







implementation


procedure TBIN2ISO.AutoInitialize;
begin
   FErrorCode := BIN2ISO_OK;
   FErrorString := '';
end;


procedure TBIN2ISO.AutoDestroy;
begin
   FISOStream.Free;
   FBinStream.Free;
end;


procedure TBIN2ISO.SetBINFilename(Filename: string);
begin
   FBinFileName := Filename;
   if not Fileexists(FBinFilename) then
   begin
      FErrorCode := BIN2ISO_NOFILEFOUND;
      FErrorString := resNoBinFileFound;
   end
   else
   begin
      FBinStream := TCDBufferedStream.Create(FBinFilename, fmOpenRead);
      FBinStream.SectorSize := 2352;
      if FBinStream.ISOSectorSizeOK = False then
      begin
         FErrorCode := BIN2ISO_NOT_RAW;
         FErrorString := resBinFileNotRAW;
      end;
   end;
end;


procedure TBIN2ISO.SetISOFilename(Filename: string);
begin
   FISOFileName := Filename;
   FISOStream := TFileStream.Create(FISOFileName, fmCreate);
end;

constructor TBIN2ISO.Create;
begin
   AutoInitialize;
end;

destructor TBIN2ISO.Destroy;
begin
   AutoDestroy;
end;


function TBIN2ISO.CheckSYNCPattern: Boolean;
var
   Buffer: PChar;
   HexStr: PChar;
   Count: Integer;
   BinType: char;
begin
   Result := False;
   Count := 16;
   try
      FBinStream.Seek(0, soFromBeginning);
      GetMem(Buffer, Count);
      GetMem(HexStr, 24);

      Buffer[Count] := #0;
      HexStr[24] := #0;

      FBinStream.Read(Buffer^, Count);
      BinToHEX(buffer, HexStr, 12);

      if HexStr = SYNCPATTERN then
      begin
         Result := true;
         FSeek_Header := 8; // setup base as audio mode  ??
         FSeek_ECC := 280;
         FSector_Size := 2336;

         BinType := Buffer[15]; // get mode id code

         if BinType = #1 then // Mode1/2352
         begin
            Result := true;
            FSeek_Header := 16;
            FSeek_ECC := 288;
            FSector_Size := 2352;
         end;
         if BinType = #2 then // Mode2/2352
         begin
            Result := true;
            FSeek_Header := 24;
            FSeek_ECC := 280;
            FSector_Size := 2352;
         end;
      end;
   finally
     // freemem(buffer);
    //  Freemem(hexstr);
   end;
end;





function TBIN2ISO.ConvertFile: Integer;

var
   Progress, Divisor: Integer;
   Buffer: PChar;
   isCancel: boolean;
begin
   Result := 0;
   Progress := 0;
   isCancel := false;
   if CheckSYNCPattern = False then
   begin
      FErrorCode := BIN2ISO_INVALID_MODE;
      FErrorString := resTrackNotSupported;
      exit;
   end;
   try
      getmem(Buffer, 2048);
      FBinStream.Seek(0, soFromBeginning);
      Divisor := (FBinStream.SectorCount div 100);
  //loop
      while (Progress < FBinStream.SectorCount) do
      begin
         FBinStream.Seek(FSeek_Header, soFromCurrent);
         FBinStream.Read(Buffer^, 2048);
         FISOStream.Write(Buffer^, 2048);
         FBinStream.Seek(FSeek_ECC, soFromCurrent);
         inc(Progress);
         if Assigned(FProgressEvent) then
            FProgressEvent((Progress div Divisor), isCancel);
         if isCancel = True then exit;
      end; //end loop
   finally
     // freemem(Buffer);
   end;
end;

end.

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -