Avatar billede psycosoft-funware Nybegynder
19. marts 2006 - 16:28 Der er 10 kommentarer og
1 løsning

udtrække info fra en binær fil

hej experter.

jeg sidder og nørkler med at udtrække noget info fra en binær fil, men det vil bare ikke rigtigt. jeg har lavet en klasse:
unit uGetPxdInfo;

interface

uses
  Classes, SysUtils;

type
  TPxdFile = class(TObject)
    private
      FValid: Boolean;
      FTagName: String;
      FGroup: String;
      FSource: String;
      FFileSize: Cardinal;
      FFileName: WideString;
      procedure FResetData;
    public
      constructor Create;
      function ReadFromFile(const FileName: WideString): Boolean;
      property Valid: Boolean read FValid;
      property FileSize: Cardinal read FFileSize;
      property TagName: String read FTagName;
      property Group: String read FGroup;
      property Source: String read FSource;
  end;

implementation

type
  PxdRecord = record
    ID: array[0..3] of Char;
    TagName: array[0..29] of Char;
    Group: array[0..19] of Char;
    Source: array[0..13] of Char;
  end;


function ReadPxd(const FileName: WideString; var PxdData: PxdRecord): Boolean;
var
  SourceFile: TFileStream;
begin
  try
    Result := true;
    SourceFile := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
    SourceFile.Free;
  except
    Result := False;
  end;
end;


function HeaderIsValid(const PxdData: PxdRecord): Boolean;
begin
  Result := True;
  if PxdData.ID <> 'tPxD' then Result := False;
end;


procedure TPxdfile.FResetData;
begin
  FValid := False;
  FFileSize := 0;
  FFileName := '';
  FTagName := '';
  FGroup := '';
  FSource := '';
end;


constructor TPxdfile.Create;
begin
  inherited;
  FResetData;
end;


function TPxdfile.ReadFromFile(const FileName: WideString): Boolean;
var
  PxdData: PxdRecord;
begin
  FResetData;
  FillChar(PxdData, SizeOf(PxdData), 0);
  Result := ReadPxd(FileName, PxdData);
  if (Result) and (HeaderIsValid(PxdData)) then
  begin
    FValid := True;
    FTagName := PxdData.TagName;
    FGroup := PxdData.Group;
    FSource := PxdData.Source;
    FFileName := FileName;
  end;
end;
end.

i pxdrecord har jeg defineret nogle statiske arrays, man da længden af TagName, Group og Source hvordan ordner man det så med en dynamisk array, eller er der en bedre måde at gribe det an på?

eks. på start af pxd fil:
tPxD  Underline** Cut 4  //hex: 74 50 78 44 14 55 6E 64 65 72 6C 69 6E 65 2A 2A
0D 0A 43 75 74 20 34

/FunteX! :-)
Avatar billede psycosoft-funware Nybegynder
19. marts 2006 - 16:32 #1
Ups, glemte lige at tilføje nogle linjer: informationen i TagName, Group og source kan længden variere, hvordan kan man ungå at "læse" for langt i filen?

/FunteX! :-)
Avatar billede kroning Nybegynder
19. marts 2006 - 16:46 #2
Er der ikke nogle standard tegn der kommer efter TagName og Group f.eks. hvis Underline** er Group så er den altid efterfulgt af en 0D ?
Avatar billede psycosoft-funware Nybegynder
19. marts 2006 - 16:52 #3
TagName er er i dette tilfælde Underline** Cut 4, Group kan fx være drum, voice osv, og Source er vhis det kommer fra HipHop eJay, Rave eJay osv - men igen det variere fra fil til fil.
eks:
ID := tPxD
TagName := *fast & deep 1
Source := Rave eJay
Group := bass

//hex: 74 50 78 44 2A 66 61 73 74 20 26 0D 0A 64 65 65
70 20 31 0D 0A 52 61 76 65 20 65 4A 61 79 0D 0A
0D 0A 62 61 73 73 0D

/FunteX!
Avatar billede kroning Nybegynder
19. marts 2006 - 17:15 #4
Det ser ud til at være 0D 0A (linieskift) der adskiller de enkelte dele, bortset fra at der også er en 0D 0A mellem "*fast &" og "deep 1"? Men 0D 0A må være det man skal lede efter.
Avatar billede psycosoft-funware Nybegynder
19. marts 2006 - 17:22 #5
du siger noget kroning.
jeg har lige skimmet 10 pxd file igennem (fra forskellige versioner af eJay) og 0D 0A, går igen.
Avatar billede kroning Nybegynder
19. marts 2006 - 18:13 #6
Hvor meget fylder sådan en pxd, eller det svinger måske meget? Men hvis den ikke fylder ret meget så kunne du måske, for at gøre det enkelt, bruge en TStringList til at indlæse den. Så vil data automatisk blive adskilt i StringListen bortset lige fra ID og TagName, meeen det er måske lidt for fusket og kan self heller ikke bruges hvis filerne kan fylde mange MB.
Avatar billede psycosoft-funware Nybegynder
22. marts 2006 - 22:53 #7
filerne svinger fra 150 kb til 800 kb....
Avatar billede psycosoft-funware Nybegynder
19. april 2006 - 21:52 #8
kroning jeg fik ikke dette til at virke :( men du fortjener en slat point som tak fordi du prøvede at hjælpe, så smid et svar :)
Avatar billede kroning Nybegynder
20. april 2006 - 07:41 #9
ok :-)
Avatar billede psycosoft-funware Nybegynder
03. september 2006 - 18:20 #10
>>kroning, kan du ikke lægge et svar, si vi kan få lukket denne tråd... :)
Avatar billede kroning Nybegynder
03. september 2006 - 18:34 #11
k
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester