Einzelnen Beitrag anzeigen

Benmik

Registriert seit: 11. Apr 2009
543 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Erste Bytes einer Datei vergleichen?

  Alt 25. Feb 2017, 22:32
Wird ja immer kürzer.
Delphi-Quellcode:
function IstRAWFormat(const Dateiname:string):Boolean;
var Datei:File; Buf:array [0..19] of Byte;
    BufCRW,BufARW,BufCR2,BufRW2,BufNEF,BufORF,BufPEF,BufRAF,BufRWL,BufSRW,BufX3F,
    BufERF,BufFFF,BufMEF,BufMRW,BufNRW,BufDCR,BufSRF:TBytes;
begin
  Result := False;
  If FileExists(Dateiname) then begin
    AssignFile(Datei,Dateiname);
    {$I-}
    Reset(Datei, 1);
    BlockRead(Datei, Buf[0], 20);
    {$I+}
    If IOResult <> 0
      then exit;
    BufCRW := [$49,$49,$1A,$00,$00,$00,$48,$45,$41,$50,$43,$43,$44,$52,$02,$00]; // Canon, veraltet
    BufCR2 := [$49,$49,$2A,$00,$10,$00,$00,$00,$43,$52]; // Canon
    BufARW := [$49,$49,$2A,$00]; // Sony, auch SR2 (Sony), 3FR (Hasselblad), IIQ (PhaseOne)
    BufRW2 := [$49,$49,$55,$00,$18,$00,$00,$00,$88,$E7,$74,$D8,$F8,$25,$1D,$4D]; // Panasonic
    BufNEF := [$4D,$4D,$00,$2A,$00,$00,$00,$08,$00]; // Nikon
    BufORF := [$49,$49,$52]; // Olympus
    BufPEF := [$4D,$4D,$00,$2A,$00]; // Pentax
    BufRAF := [$46,$55,$4A,$49,$46,$49,$4C,$4D,$43,$43,$44,$2D,$52,$41,$57,$20]; // Fujifilm
    BufRWL := [$49,$49,$55,$00]; // Leica
    BufSRW := [$4D,$4D,$00,$2A,$00,$00,$00,$08,$00,$06,$01,$0F,$00,$02,$00,$00]; // Samsung
    BufX3F := [$46,$4F,$56,$62]; // Sigma
    // veraltet
    BufDCR := [$44,$53,$43,$2D,$49,$6D,$61,$67,$65]; // Kodak, veraltet
    BufERF := [$43,$6F,$6D,$70,$75,$63,$6F,$6E,$20,$45,$4F,$53,$20,$44,$65,$73]; // Epson, veraltet
    BufFFF := [$4D,$4D,$00,$2A]; // Hasselblad, veraltet
    BufMEF := [$4D,$52,$00,$00,$00,$00,$00,$00,$00,$00,$1C,$0E]; // Mamiya, veraltet
    BufMRW := [$00,$4D,$52,$4D]; // Minolta, veraltet
    BufNRW := [$4E,$4F,$4B,$49,$41,$52,$41,$57]; // Nokia, veraltet
    BufSRF := [$4C,$53]; // Sony, veraltet, DSC-F828 von 2004
    Result := CompareMem(@BufCRW[0],@Buf[0],Length(BufCRW))
           or CompareMem(@BufCR2[0],@Buf[0],Length(BufCR2))
           or CompareMem(@BufARW[0],@Buf[0],Length(BufARW))
           or CompareMem(@BufRW2[0],@Buf[0],Length(BufRW2))
           or CompareMem(@BufNEF[0],@Buf[0],Length(BufNEF))
           or CompareMem(@BufORF[0],@Buf[0],Length(BufORF))
           or CompareMem(@BufPEF[0],@Buf[0],Length(BufPEF))
           or CompareMem(@BufRAF[0],@Buf[0],Length(BufRAF))
           or CompareMem(@BufRWL[0],@Buf[0],Length(BufRWL))
           or CompareMem(@BufSRW[0],@Buf[0],Length(BufSRW))
           or CompareMem(@BufX3F[0],@Buf[0],Length(BufX3F))
           // veraltet
           or CompareMem(@BufDCR[0],@Buf[0],Length(BufDCR))
           or CompareMem(@BufERF[0],@Buf[0],Length(BufERF))
           or CompareMem(@BufFFF[0],@Buf[0],Length(BufFFF))
           or CompareMem(@BufMEF[0],@Buf[0],Length(BufMEF))
           or CompareMem(@BufMRW[0],@Buf[0],Length(BufMRW))
           or CompareMem(@BufNRW[0],@Buf[0],Length(BufNRW))
           or CompareMem(@BufSRF[0],@Buf[0],Length(BufSRF));
    CloseFile(Datei);
  end;
end;
Gibt es sonst noch was? Vielleicht die Steinzeitroutine AssignFile ? Ich dachte, es ist ja nicht nötig, mit einem FileStream die ganze Datei einzulesen. Außerdem habe ich das Try..Except durch ein IOResult ersetzt.

Geändert von Benmik (25. Feb 2017 um 23:42 Uhr) Grund: Kleine Fleißarbeit: Zahlreiche Formate hinzugefügt
  Mit Zitat antworten Zitat