Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Delphi Erste Bytes einer Datei vergleichen? (https://www.delphipraxis.net/191861-erste-bytes-einer-datei-vergleichen.html)

Benmik 27. Feb 2017 19:32

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:
$I-}
und Try ist natürlich Unsinn. Hab ich ja auch geändert. TFileStream und Read ist auch besser.

@Uwe Raabe: Wirklich toll. Was ich nicht verstehe: Warum das savePos? Aus Interesse: Wie sähe eine Enumeration denn aus?

Uwe Raabe 27. Feb 2017 22:15

AW: Erste Bytes einer Datei vergleichen?
 
Zitat:

Zitat von Benmik (Beitrag 1362817)
Was ich nicht verstehe: Warum das savePos?

Damit der Stream nach dem Aufruf wieder an der richtigen Stelle steht und vom aufrufenden Teil weiterverarbeitet werden kann. Sonst würden ja die ersten 20 Bytes fehlen.

Zitat:

Zitat von Benmik (Beitrag 1362817)
Aus Interesse: Wie sähe eine Enumeration denn aus?

Etwa so:
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;

himitsu 27. Feb 2017 22:20

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:
array[TRAWFormat] of TBytes
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.

Uwe Raabe 27. Feb 2017 23:10

AW: Erste Bytes einer Datei vergleichen?
 
Zitat:

Zitat von himitsu (Beitrag 1362823)
Delphi-Quellcode:
array[TRAWFormat] of TBytes
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.

Hast du mal versucht, so ein Array als Konstante zu deklarieren?

Benmik 28. Feb 2017 19:49

AW: Erste Bytes einer Datei vergleichen?
 
Vielen Dank euch beiden.
Delphi-Quellcode:
TRawFormat(I)
war der Punkt. Dass man an den (Integer-)Wert mittels
Delphi-Quellcode:
Ord(RawFormat)
rankommt, weiß ich mittlerweile; dass man auf ein Glied von TRawFormat so einfach zugreifen kann, weiß ich jetzt.
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?

t.roller 28. Feb 2017 20:32

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

himitsu 28. Feb 2017 20:43

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.

Benmik 2. Mär 2017 20:43

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.

himitsu 2. Mär 2017 22:54

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:

das wäre also noch deutlich mehr als ein Festplattensektor
Nein.

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)

Uwe Raabe 2. Mär 2017 23:07

AW: Erste Bytes einer Datei vergleichen?
 
Zitat:

Zitat von Benmik (Beitrag 1363072)
Laut einer Quelle verwendet der File Cache immer "Sections" von 256 KB,

Zitat:

Zitat von himitsu (Beitrag 1363078)
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.

Ich weiß zwar nicht, woher die 256K kommen, aber das ist doch schon deutlich mehr als 4K.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:18 Uhr.
Seite 2 von 3     12 3      

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