![]() |
AW: Erste Bytes einer Datei vergleichen?
@Himitsu: Du hast natürlich Recht. Ich hatte den Code mal von irgendwoher übernommen und habe erst jetzt mal genauer geguckt:
Delphi-Quellcode:
und Try ist natürlich Unsinn. Hab ich ja auch geändert. TFileStream und Read ist auch besser.
$I-}
@Uwe Raabe: Wirklich toll. Was ich nicht verstehe: Warum das savePos? Aus Interesse: Wie sähe eine Enumeration denn aus? |
AW: Erste Bytes einer Datei vergleichen?
Zitat:
Zitat:
Delphi-Quellcode:
type
TRAWFormat = (rawUnknown, rawCanonOld, rawCanon, rawSony, rawPanasonic, rawNikon, rawOlympus, rawPentax, rawFuji, rawLeica, rawSamsung, rawSigma, rawKodak, rawEpson, rawHasselblad, rawMamiya, rawMinolta, rawNokia, rawSonyOld); function GetRAWFormat(const Buf: TBytes): TRAWFormat; overload; const cRawHeader: TArray<TBytes> = [ [$49,$49,$1A,$00,$00,$00,$48,$45,$41,$50,$43,$43,$44,$52,$02,$00], // Canon, veraltet [$49,$49,$2A,$00,$10,$00,$00,$00,$43,$52], // Canon [$49,$49,$2A,$00], // Sony, auch SR2 (Sony), 3FR (Hasselblad), IIQ (PhaseOne) [$49,$49,$55,$00,$18,$00,$00,$00,$88,$E7,$74,$D8,$F8,$25,$1D,$4D], // Panasonic [$4D,$4D,$00,$2A,$00,$00,$00,$08,$00], // Nikon [$49,$49,$52], // Olympus [$4D,$4D,$00,$2A,$00], // Pentax [$46,$55,$4A,$49,$46,$49,$4C,$4D,$43,$43,$44,$2D,$52,$41,$57,$20], // Fujifilm [$49,$49,$55,$00], // Leica [$4D,$4D,$00,$2A,$00,$00,$00,$08,$00,$06,$01,$0F,$00,$02,$00,$00], // Samsung [$46,$4F,$56,$62], // Sigma // veraltet [$44,$53,$43,$2D,$49,$6D,$61,$67,$65], // Kodak, veraltet [$43,$6F,$6D,$70,$75,$63,$6F,$6E,$20,$45,$4F,$53,$20,$44,$65,$73], // Epson, veraltet [$4D,$4D,$00,$2A], // Hasselblad, veraltet [$4D,$52,$00,$00,$00,$00,$00,$00,$00,$00,$1C,$0E], // Mamiya, veraltet [$00,$4D,$52,$4D], // Minolta, veraltet [$4E,$4F,$4B,$49,$41,$52,$41,$57], // Nokia, veraltet [$4C,$53] // Sony, veraltet, DSC-F828 von 2004 ]; var I: Integer; rawHeader: TBytes; begin for I := Low(rawHeader) to High(rawHeader) do begin rawHeader := cRawHeader[I]; if CompareMem(@rawHeader[0], @Buf[0], Length(rawHeader)) then Exit(TRawFormat(I)); end; Result := rawUnknown; end; |
AW: Erste Bytes einer Datei vergleichen?
Das SavePos ist, damit die Funktion univeral ist und den Stream nicht verändert, für nachfolgene Leseoperationen.
Delphi-Quellcode:
und man kann erstens direkt Result als Schleifenvariable nutzen und hat eine Bereichsprüfung für das Array, damit die Anzahl mit dem Enum übereinstimmt.
array[TRAWFormat] of TBytes
|
AW: Erste Bytes einer Datei vergleichen?
Zitat:
|
AW: Erste Bytes einer Datei vergleichen?
Vielen Dank euch beiden.
Delphi-Quellcode:
war der Punkt. Dass man an den (Integer-)Wert mittels
TRawFormat(I)
Delphi-Quellcode:
rankommt, weiß ich mittlerweile; dass man auf ein Glied von TRawFormat so einfach zugreifen kann, weiß ich jetzt.
Ord(RawFormat)
Das savePos war mir nicht klar, weil ich ja gerade eben von jeder JPG-Datei nur die ersten 20 Bytes auslesen will; aber klar, für einen universelleren Gebrauch ist das nützlich. Ebenfalls aus (Fortbildungs-)Interesse: Ist es vielleicht eine Illusion zu glauben, man würde mit einer Beschränkung auf die ersten 20 Bytes Zeit sparen? Wäre es bei einer Festplatte schneller, einen Sektor auszulesen? Oder ist das egal, weil sowieso immer ein Sektor ausgelesen wird? Werden bei einer SSD hingegen tatsächlich nur die ersten 20 Bytes gelesen? |
AW: Erste Bytes einer Datei vergleichen?
Üblicherweise wird eine ganze Zuordnungseinheit gelesen.
Die ist formatabhängig und abhängig von der Grösse des Speichermediums. Beispiel USB-Stick 8 GB Zuordnungseinheit: FAT32: 4096 Bytes NTFS: 4096 Bytes exFAT: 32 KBytes |
AW: Erste Bytes einer Datei vergleichen?
Die von dir genutzen File-APIs verwenden alle den WindowsFileCache.
Somit ist es egal ob 1, 20 oder 200 Byte gelesen werden. Die Festplatte liefert eh immer nur ganze Sektoren, wodurch also immer mindestens ein Sektor ausgelesen wird. |
AW: Erste Bytes einer Datei vergleichen?
Hab ich mir so ungefähr gedacht. Laut einer Quelle verwendet der File Cache immer "Sections" von 256 KB, das wäre also noch deutlich mehr als ein Festplattensektor. Merk ich mir mal für die Zukunft, dass man eine Datei immer 256 KB weit auslesen kann, wenn man sie überhaupt anfasst.
|
AW: Erste Bytes einer Datei vergleichen?
Ich hatte bei der WFC mindestens 4K erwartet, da Windows den Arbeistspeicher in 4K-Blöcken verwaltet. :angle:
Aber vom Tempo her ist das da fast egal ob ein Vierttel oder Vier. Zitat:
Die kleinste Sektorgröße ist 512. (bei den meisten HDDs) Bei großen Terrabyteplatten sind die Sektoren auch schon mal 4K oder mehr. Bei SSDs sind die realen Speicherblöcke oft sogar mehrere Sektoren groß, da die sich kompatibel ausgeben wollen (512 vorgaukeln, aber eigentlich mehrere Sektoren in einem Speicherbereich liegen haben) Und in Windows und Co. sind die Clustergrößen oft auch nochmal größer als je ein Sektor, vorallem bei sehr großen Partitionen. (siehe Datenträgerformatierung) |
AW: Erste Bytes einer Datei vergleichen?
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz