Registriert seit: 11. Apr 2009
560 Beiträge
Delphi 12 Athens
|
AW: Erste Bytes einer Datei vergleichen?
25. Feb 2017, 23: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 (26. Feb 2017 um 00:42 Uhr)
Grund: Kleine Fleißarbeit: Zahlreiche Formate hinzugefügt
|