Heim  >  Artikel  >  Backend-Entwicklung  >  Wie liest man Binärdateien effizient in einen Vektor aus vorzeichenlosen Zeichen ein?

Wie liest man Binärdateien effizient in einen Vektor aus vorzeichenlosen Zeichen ein?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-10-30 08:00:03533Durchsuche

How to Read Binary Files into a Vector of Unsigned Chars Efficiently?

Effizientes Einlesen von Binärdateien in einen Vektor aus vorzeichenlosen Zeichen

Methoden zum Lesen von Binärdateien

Um eine Binärdatei effizient in einen Vektor aus vorzeichenlosen Zeichen (std::vector) einzulesen, stehen mehrere Methoden zur Verfügung:

Methode 1:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::ifstream file(filename, std::ios::binary);
  std::streampos fileSize = file.tellg();
  std::vector<BYTE> fileData(fileSize);
  file.read((char*) &fileData[0], fileSize);
  return fileData;
}</code>

Diese Methode öffnet die Datei und verwendet file.seekg/file.tellg, um ihre Größe zu bestimmen. Anschließend wird ein Vektor mit der entsprechenden Größe zugewiesen und die Daten gelesen. Es erfordert jedoch eine explizite Umwandlung in char*, was unpraktisch sein kann.

Methode 2:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::ifstream file(filename, std::ios::binary);
  return std::vector<BYTE>((std::istreambuf_iterator<char>(file)),
                            std::istreambuf_iterator<char>());
}</code>

Diese Methode verwendet std::istreambuf_iterator zum Durchlaufen die Zeichen der Datei und konstruieren den Vektor, aber es erfordert eine Umwandlung in char, obwohl der Vektor vorzeichenlose Zeichen speichert.

Methode 3:

<code class="cpp">std::vector<BYTE> readFile(const char* filename) {
  std::basic_ifstream<BYTE> file(filename, std::ios::binary);
  return std::vector<BYTE>((std::istreambuf_iterator<BYTE>(file)),
                            std::istreambuf_iterator<BYTE>());
}</code>

Diese Methode verwendet direkt ein std::basic_ifstream mit dem gewünschten Typ BYTE, wodurch die Notwendigkeit einer Umwandlung entfällt.

Bedienung hinter den Kulissen:

Bei Verwendung von std::istreambuf_iterator Die zugrunde liegenden Vorgänge umfassen das Lesen aus dem internen Puffer der Datei und das Konvertieren der char-Daten in den gewünschten Typ (in diesem Fall BYTE). Aufgrund dieses Konvertierungsprozesses können jedoch einige Leistungsprobleme auftreten.

Leistungsoptimierung:

Um die Leistung zu optimieren, berücksichtigen Sie Folgendes:

  • Mit std::basic_ifstream für die direkte Typverarbeitung.
  • Reservieren von Kapazität für den Vektor vor dem Lesen, um mehrfache Größenänderungen zu vermeiden.
  • Einsatz von std::copy mit speziellen Iteratoren, um Daten effizient von der Datei in den Vektor zu übertragen.
  • Stellen Sie sicher, dass der Binärmodus der Datei aktiviert ist (std::ios::binary) und das Überspringen von Zeilenumbrüchen deaktiviert ist (std::noskipws), da sich diese Einstellungen auswirken können Lesen von Binärdaten.

Das obige ist der detaillierte Inhalt vonWie liest man Binärdateien effizient in einen Vektor aus vorzeichenlosen Zeichen ein?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn