<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Festplattenimage einlesen C&#x2F;C++]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem. Wie kann ich am einfachsten bzw. effizientesten ein mehrere GB großes Festplattenimage zur Weiterverarbeitung in C++ einlesen? Letzten Endes möchte ich das Image auf diverse Bytestrukturen untersuchen. Hat damit jemand Erfahrung gemacht bzw. kennt evtl. eine Library?</p>
<p>Vielen Dank und Grüße<br />
tommy</p>
]]></description><link>https://www.c-plusplus.net/forum/topic/307016/festplattenimage-einlesen-c-c</link><generator>RSS for Node</generator><lastBuildDate>Fri, 07 Aug 2026 03:42:09 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/307016.rss" rel="self" type="application/rss+xml"/><pubDate>Tue, 14 Aug 2012 09:15:23 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 09:15:23 GMT]]></title><description><![CDATA[<p>Hallo Leute,</p>
<p>ich habe folgendes Problem. Wie kann ich am einfachsten bzw. effizientesten ein mehrere GB großes Festplattenimage zur Weiterverarbeitung in C++ einlesen? Letzten Endes möchte ich das Image auf diverse Bytestrukturen untersuchen. Hat damit jemand Erfahrung gemacht bzw. kennt evtl. eine Library?</p>
<p>Vielen Dank und Grüße<br />
tommy</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241713</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241713</guid><dc:creator><![CDATA[tommy0816]]></dc:creator><pubDate>Tue, 14 Aug 2012 09:15:23 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 09:30:26 GMT]]></title><description><![CDATA[<p>tommy0816 schrieb:</p>
<blockquote>
<p>Wie kann ich am einfachsten bzw. effizientesten ein mehrere GB großes Festplattenimage zur Weiterverarbeitung in C++ einlesen? Letzten Endes möchte ich das Image auf diverse Bytestrukturen untersuchen.</p>
</blockquote>
<p>Wie wäre es hiermit?</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;fstream&gt;
#include &lt;iterator&gt;
#include &lt;vector&gt;

int main()
{
	std::ifstream file(&quot;xyz.img&quot;,std::ios_base::binary);
	std::vector&lt;unsigned char&gt; image;
	file &gt;&gt; std::noskipws;
	std::copy( std::istream_iterator&lt;unsigned char&gt;(file), std::istream_iterator&lt;unsigned char&gt;(), std::back_inserter(image) );
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2241719</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241719</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 14 Aug 2012 09:30:26 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 09:46:01 GMT]]></title><description><![CDATA[<p>out schrieb:</p>
<blockquote>
<p>tommy0816 schrieb:</p>
<blockquote>
<p>Wie kann ich am einfachsten bzw. effizientesten ein mehrere GB großes Festplattenimage zur Weiterverarbeitung in C++ einlesen? Letzten Endes möchte ich das Image auf diverse Bytestrukturen untersuchen.</p>
</blockquote>
<p>Wie wäre es hiermit?</p>
<pre><code class="language-cpp">#include &lt;algorithm&gt;
#include &lt;fstream&gt;
#include &lt;iterator&gt;
#include &lt;vector&gt;

int main()
{
	std::ifstream file(&quot;xyz.img&quot;,std::ios_base::binary);
	std::vector&lt;unsigned char&gt; image;
	file &gt;&gt; std::noskipws;
	std::copy( std::istream_iterator&lt;unsigned char&gt;(file), std::istream_iterator&lt;unsigned char&gt;(), std::back_inserter(image) );
}
</code></pre>
</blockquote>
<p>Das ist definitiv nicht effizient, sondern eher die ineffizienteste Art (abgesehen von absichtlichen Warteschleifen im Code). Nimm read und Konsorten. Als Datenstruktur kommt es drauf an, wie groß das Image ist und wie groß der Arbeitsspeicher ist. Prinzipiell klingt die Suche nach Mustern nach einem Fall für vector, eventuell deque (falls man an der Arbeitsspeicherkapazität kratzt). Festplattenimages sind aber in der Regel wesentlich größer als ein paar Gigabytes, da wird man sich wohl fragen müssen, ob es nicht auch in Frage käme, das Image stückchenweise zu betrachten. Ganz einlesen wird in der Regel aus technischen Gründen nicht möglich sein.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241730</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241730</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Aug 2012 09:46:01 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:06:45 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Nimm read und Konsorten.</p>
</blockquote>
<p>Meinst du so?</p>
<pre><code class="language-cpp">int main()
{
	std::ifstream file(&quot;xyz.img&quot;,std::ios_base::binary);

	file.seekg(0,std::ios_base::end);
	unsigned length = file.tellg();
	file.seekg(0,std::ios_base::beg);

	char* image = new char[length];
	file.read(image,length);
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/2241741</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241741</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:06:45 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:13:46 GMT]]></title><description><![CDATA[<p>Ich verstehe zwar nicht, wieso du keinen vector nimmst, aber im Prinzip ja.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241744</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241744</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:13:46 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:19:05 GMT]]></title><description><![CDATA[<p>Würde das Ganze blockweise einlesen und auf Muster prüfen. Du musst allerdings den Sonderfall betrachten, dass ein Blockwechsel mitten im Muster auftreten kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241746</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241746</guid><dc:creator><![CDATA[DocShoe]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:19:05 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:19:21 GMT]]></title><description><![CDATA[<p>Wieso genau musst du unbedingt das ganze Image in den Speicher laden? Wie schon angedeutet wurde, wird man wohl davon ausgehen müssen, dass so ein Festplattenimage potentiell wesentlich größer ist als der verfügbare Arbeitsspeicher!?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241747</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241747</guid><dc:creator><![CDATA[dot]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:19:21 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:47:15 GMT]]></title><description><![CDATA[<p>SeppJ schrieb:</p>
<blockquote>
<p>Ich verstehe zwar nicht, wieso du keinen vector nimmst, aber im Prinzip ja.</p>
</blockquote>
<p><code>read</code> will doch ein <code>char*</code> als Argument. <code>vector</code> kann ich dann doch erst einsetzen, nachdem ich <code>read</code> gemacht habe.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241754</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241754</guid><dc:creator><![CDATA[out]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:47:15 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 10:58:12 GMT]]></title><description><![CDATA[<p>Sepp meint damit sowas:</p>
<pre><code class="language-cpp">#include &lt;vector&gt;
#include &lt;fstream&gt;

int main()
{
    // open file
    std::ifstream file(&quot;hdd.img&quot;, std::ios::binary);

    // determine size
    file.seekg(0,std::ios_base::end);
    unsigned length = file.tellg();
    file.seekg(0,std::ios_base::beg);

    // allocate buffer
    std::vector&lt;char&gt; buffer(length);

    // read data
    file.read(&amp;(buffer[0]), length);
}
</code></pre>
<p>Vorteil ist hier, dass der vector den Speicher selbstständig wieder freigibt.<br />
Du solltest aber weiterhin beachten, dass eben Festplatten-Images meistens größer sind als dein Arbeitsspeicher.<br />
(Abgesehen davon, dass unsigned int sowohl bei x86 als auch x86_64 lediglich 32 Bit groß ist. Ist dein Image größer, so werden bei deiner length einfach die überschüssigen Bits weggeschnitten.)</p>
<p>Sinnvoll wäre es, sich mit den Datenstrukturen auf einer Festplatte zu befassen (MBR, Dateisystem-Tabellen usw.). Diese enthalten Adressen von anderen wichtigen Datenblöcken im Image, sodass man gezielt nur die relevanten Blöcke laden kann.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241762</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241762</guid><dc:creator><![CDATA[DrakoXP]]></dc:creator><pubDate>Tue, 14 Aug 2012 10:58:12 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 12:18:15 GMT]]></title><description><![CDATA[<p>Da das Einlesen der Datei vermutlich von einem langsamen Medium geschieht, ist das A und O hier die Minimierung der Dateizugriffe. Wenn ich</p>
<p>tommy0816 schrieb:</p>
<blockquote>
<p>Letzten Endes möchte ich das Image auf diverse Bytestrukturen untersuchen.</p>
</blockquote>
<p>richtig verstehe, empfiehlt sich daher eine Vorgehensweise, wie sie beispielsweise von GNU grep benutzt wird (siehe <a href="http://lists.freebsd.org/pipermail/freebsd-current/2010-August/019310.html" rel="nofollow">hier</a>): Nur die Bytes holen, die man auch wirklich ankucken will. Habe ich beispielsweise eine 512 Byte lange Pattern und stelle fest, dass das Byte 512 Byte hinter meiner Position nicht passt, kann ich gleich 512 Byte weiterspringen.</p>
<p>Es gibt eine Reihe von <a href="https://de.wikipedia.org/wiki/String-Matching-Algorithmus" rel="nofollow">Algorithmen</a>, die sich für diesen Zweck anbieten und ein solches Vorgehen erlauben. GNU grep benutzt Boyer-Moore, und das könnte auch für dich eine gute Wahl sein. Letztendlich kann ich das aber aus der Enternung natürlich nicht mit Bestimmtheit sagen.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241791</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241791</guid><dc:creator><![CDATA[seldon]]></dc:creator><pubDate>Tue, 14 Aug 2012 12:18:15 GMT</pubDate></item><item><title><![CDATA[Reply to Festplattenimage einlesen C&#x2F;C++ on Tue, 14 Aug 2012 12:22:20 GMT]]></title><description><![CDATA[<p>DrakoXP schrieb:</p>
<blockquote>
<p>(Abgesehen davon, dass unsigned int sowohl bei x86 als auch x86_64 lediglich 32 Bit groß ist. Ist dein Image größer, so werden bei deiner length einfach die überschüssigen Bits weggeschnitten.)</p>
</blockquote>
<p>std::streamsize FTW!</p>
]]></description><link>https://www.c-plusplus.net/forum/post/2241795</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/2241795</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Tue, 14 Aug 2012 12:22:20 GMT</pubDate></item></channel></rss>