<?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[[gelöst]Binary File wird nicht geöffnet :&#x27;(]]></title><description><![CDATA[<p>Hey Leuts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich hab mir heute mal die Headerspezifikationen für jpg Dateien angesehen, wollte nun mal n Programm schreiben um die Informationen auszulesen... Das Programm sollte testweise einfach die x und y Größe des Bildes ermitteln. Hier der Sourcecode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

using namespace std;

int main(int argc,char *argv[])
{
    char xSize[2];
    char ySize[2];

    fstream oImage(&quot;colors2.JPG&quot;,ios::binary);
    if(oImage)
    {
        oImage.seekg(14, ios::beg);
        oImage.read(xSize,2);
        oImage.seekg(16, ios::beg);
        oImage.read(ySize,2);
        oImage.close();
        cout &lt;&lt; &quot;X: &quot; &lt;&lt; xSize &lt;&lt; endl
             &lt;&lt; &quot;Y; &quot; &lt;&lt; ySize &lt;&lt; endl;
    }
    else
    {
        cout &lt;&lt; &quot;Failed to open file!&quot;;    
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/topic/275032/gelöst-binary-file-wird-nicht-geöffnet</link><generator>RSS for Node</generator><lastBuildDate>Wed, 26 Aug 2026 15:28:56 GMT</lastBuildDate><atom:link href="https://www.c-plusplus.net/forum/topic/275032.rss" rel="self" type="application/rss+xml"/><pubDate>Thu, 07 Oct 2010 14:14:02 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Fri, 22 Oct 2010 12:22:04 GMT]]></title><description><![CDATA[<p>Hey Leuts <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Ich hab mir heute mal die Headerspezifikationen für jpg Dateien angesehen, wollte nun mal n Programm schreiben um die Informationen auszulesen... Das Programm sollte testweise einfach die x und y Größe des Bildes ermitteln. Hier der Sourcecode:</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

using namespace std;

int main(int argc,char *argv[])
{
    char xSize[2];
    char ySize[2];

    fstream oImage(&quot;colors2.JPG&quot;,ios::binary);
    if(oImage)
    {
        oImage.seekg(14, ios::beg);
        oImage.read(xSize,2);
        oImage.seekg(16, ios::beg);
        oImage.read(ySize,2);
        oImage.close();
        cout &lt;&lt; &quot;X: &quot; &lt;&lt; xSize &lt;&lt; endl
             &lt;&lt; &quot;Y; &quot; &lt;&lt; ySize &lt;&lt; endl;
    }
    else
    {
        cout &lt;&lt; &quot;Failed to open file!&quot;;    
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1962570</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962570</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Fri, 22 Oct 2010 12:22:04 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:15:20 GMT]]></title><description><![CDATA[<p>Ups, hab mein Problem ganz vergessen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Also, mir wird immer der Fehler &quot;Failed to open file!&quot; angezeigt im Konsolenfenster, obwohl die exe und das bild im gleichen ordner liegen... ^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962571</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962571</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:15:20 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:17:18 GMT]]></title><description><![CDATA[<p>Nimm mal einen ifstream statt eines fstreams wenn du nur Lesen willst. Dein OS ist Windows, rate ich mal? Da ist auch der aktuelle Suchpfad nicht zwangsläufig der Pfad wo die exe liegt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962574</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962574</guid><dc:creator><![CDATA[SeppJ]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:17:18 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:33:25 GMT]]></title><description><![CDATA[<p>Außerdem ist es recht fragwürdig, was du da suchst. Der &quot;Magic number&quot; (FFD8) kann auch ein FFE1 folgen. Dies ist dann ersteinmal der Exif-Block. Der 16 Bit-Wert dahinter gibt Aufschluss über die Größe dieses Blocks und muss beim Setzen des Filepointers berücksichtigt werden.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962586</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962586</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:33:25 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:43:31 GMT]]></title><description><![CDATA[<p>Danke <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Das mit der Pfadangabe traf zu, hab jetzt nen absoluten Pfad genommen, das hat gepasst <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f61b.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--face_with_tongue"
      title=":P"
      alt="😛"
    /><br />
Das heißt, ich sollte nach dem Wert FFE0 suchen, dann von dort aus zu den Werten springen? o:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962592</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962592</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:43:31 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:50:58 GMT]]></title><description><![CDATA[<p>So einfach ist es leider nicht. FFE0 kann ja auch so in der Datei stehen. Du suchst normalerweise von Anfang an nach FF und wertest das Byte dahinter aus. Wenn du nichts damit anfangen kannst/möchtest, liest du den 16 Bit-Wert dahinter und überspringst diesen Bereich (die Größe ist ohne diesen 16 Bit-Wert angegeben, d.h. übersprungen werden muss der Wert-2).<br />
Ich meine auch, die Größe des Bildes steht im SOF-Bereich (imho FFC0).</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962597</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962597</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:50:58 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 14:55:02 GMT]]></title><description><![CDATA[<p>Upps, ja stimmt wohl, steht im SOF-Bereich <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Das heißt, ich such nach FFC0, werte die nächsten 2 Bytes aus, wenn diese &quot;17&quot; sind, dann hab ich den richtigen Bereich?^^</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962598</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962598</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Thu, 07 Oct 2010 14:55:02 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 15:12:46 GMT]]></title><description><![CDATA[<p>Ja, so könnte man es machen, mit einigem Pech klappt das aber auch nicht zuverlässig.<br />
Bsp.</p>
<pre><code>FFD8   - magic number
FFE1   - exif
1CEE   - Größe des Blockes-&gt;überspringen
..
FFE0   - APP0, hier stehen Daten, die man eigentlich auswerten sollte &quot;jfif&quot; etc.
???    - Größe, normalerweise 16, muss aber ausgewertet werden
FFDB   - DQT, quantization table
???    - Größe
...
es folgen noch
SOI	0xD8
EOI	0xD9
SOF	0xC0
DHT	0xC4
SOS	0xDA
DRI	0xDD
COM	0xFE
</code></pre>
<p>Das Auslesen geschieht also in einer Schleife, Blöcke die nicht benötigt werden, werden übersprungen. Wichtig ist, wie eben geschrieben, dass die Größe des Wertes nicht mit gespeichert ist.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962607</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962607</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 07 Oct 2010 15:12:46 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 15:29:54 GMT]]></title><description><![CDATA[<p>Soweit so schlecht... <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Mein Programm findet kein ffc0! o:<br />
Woran liegt das wohl?</p>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;

using namespace std;

int main(int argc,char *argv[])
{
	char xSize[2];
	char ySize[2];
	char pattern[] = {0xff,0xc0};
    string linebuf;
	ifstream oImage(&quot;C:\\colors2.JPG&quot;,ios::binary);
	if(oImage)
	{
        while(!oImage.eof())
        {
            getline(oImage,linebuf);
            if(int pos = linebuf.find(pattern) != -1)
            {
                cout &lt;&lt; &quot;FFC0 found at &quot; &lt;&lt; pos &lt;&lt; endl;
                break;
            }
        }
        cout &lt;&lt; &quot;Couldn't find FFC0!&quot; &lt;&lt; endl;
        oImage.close();
    }
    else
    {
        cout &lt;&lt; &quot;Failed to open file!&quot;;
    }
}
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1962616</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962616</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Thu, 07 Oct 2010 15:29:54 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 07 Oct 2010 17:35:10 GMT]]></title><description><![CDATA[<p>Okay, wenn du nur ein paar Headerinformationen haben möchtest, reicht es natürlich, immer wieder einzelne Zeichen aus der Datei zu lesen und abbrechen, wenn alles gefunden wurde. Anders sähe es natürlich aus, wenn du komplett dekodieren möchtest.</p>
<pre><code class="language-cpp">bool bFound = false;
char c;
while(!oImage.eof() &amp;&amp; !bFound)
{
	oImage.get(c);
	if((BYTE)c!=0xFF)
		continue;
	oImage.get(c);
	unsigned int i = ((BYTE)c) &amp; 0xFF;
	switch(i)
	{
		case 0xD8:
			cout &lt;&lt; &quot;found start marker!&quot;&lt;&lt;endl;
			break;
		case 0xC0:
		{
			const streampos offset = 3;
			oImage.seekg(oImage.tellg()+offset);
			ySize = GetWord(oImage);
			xSize = GetWord(oImage);
			cout &lt;&lt; &quot;w: &quot;&lt;&lt; xSize &lt;&lt; &quot; , h: &quot; &lt;&lt; ySize &lt;&lt; endl;
			bFound = true;
			break;
		}
		default:
		{	const streampos offset = 2;
			sValue = GetWord(oImage);
			oImage.seekg(oImage.tellg()+(long)sValue-offset);
			break;
		}
	}
}
</code></pre>
<p>Es wird zeichenweise eingelesen, überprüft ab der Wert 0xFF ist, wenn nein, wird einfach weitergemacht.<br />
Im default-Zweig wird die Größe gelesen und der Filepointer neu gesetzt (-2!).<br />
Für soetwas würde ich normalerweise die OS-Fkt. ReadFile nehmen, mit der man direkt in einen unsigned short lesen kann*. Naja, so gehts auch:</p>
<pre><code class="language-cpp">unsigned short GetWord(ifstream&amp; in)
{
	char c;
	unsigned short s;
	in.get(c);
	s=(BYTE)c;
	s&lt;&lt;=8;
	in.get(c);
	s|=(BYTE)c;
	return s;
}
</code></pre>
<p>Es könnten natürlich Fehler drin stecken, ich habs gerade nur mit 2 Bildern probiert.</p>
<p>* Mit einem ifstream gehts vielleicht auch, binär lese ich damit jedoch sonst nie.</p>
<p>Edit: Ach ja die Casts kannste ja noch mal überarbeiten <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962637</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962637</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 07 Oct 2010 17:35:10 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Fri, 08 Oct 2010 09:07:02 GMT]]></title><description><![CDATA[<p>Ich hätte noch schreiben sollen, was bei deinem Code nicht passt. Du liest die Datei binär, ein getline ist deshalb zwecklos.<br />
Grundsätzlich ist das Lesen von fremden Dateiformaten keine schöne Angelegenheit. Du solltest dir einen Hex-Editor herunterladen und die Dateien analysieren (ich nutze <a href="http://www.softpedia.com/get/Others/Miscellaneous/tiny-hexer.shtml" rel="nofollow">http://www.softpedia.com/get/Others/Miscellaneous/tiny-hexer.shtml</a> [windows]). Als wirklich gute Übung kannst du dir mal das Exif-Format anschauen und einen Tagger bauen <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f609.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--winking_face"
      title=";)"
      alt="😉"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1962800</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1962800</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Fri, 08 Oct 2010 09:07:02 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 13 Oct 2010 08:42:08 GMT]]></title><description><![CDATA[<p>Okay, durch deine ausführliche Antwort wurde mir hier einiges klar, allerdings bin ich mir bei deiner GetWord-Funktion noch unsicher...</p>
<pre><code class="language-cpp">unsigned short GetWord(ifstream&amp; in)
{
    char c;
    unsigned short s;
    in.get(c);
    s=(BYTE)c;
    s&lt;&lt;=8;  //Diese Operation versteh ich nich. ^^
    in.get(c);
    s|=(BYTE)c; //Das íst mir auch noch unklar.
    return s;
}
</code></pre>
<p>Trotzdem vielen Dank und dickes Lob für die Ausführlichkeit <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /></p>
]]></description><link>https://www.c-plusplus.net/forum/post/1964822</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964822</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Wed, 13 Oct 2010 08:42:08 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 13 Oct 2010 10:35:44 GMT]]></title><description><![CDATA[<p>char = 8b it<br />
unsined short = 16 bit</p>
<p>in.getc(c = 00110011)</p>
<p>unsigned short = c<br />
00000000 00110011</p>
<p>unsigned short &lt;&lt; 8<br />
00110011 00000000</p>
<p>in.getc(c = 10101010)</p>
<p>unsigned short |= c<br />
00110011 00000000<br />
10101010<br />
-----------------<br />
00110011 10101010</p>
<p>Stichwort: bitweise Operatoren, shiften</p>
<p><a href="http://www.cplusplus.com/doc/tutorial/operators/" rel="nofollow">http://www.cplusplus.com/doc/tutorial/operators/</a> weit unten</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1964882</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964882</guid><dc:creator><![CDATA[padreigh]]></dc:creator><pubDate>Wed, 13 Oct 2010 10:35:44 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 13 Oct 2010 10:57:14 GMT]]></title><description><![CDATA[<p>Klappte denn das Einlesen der Werte bei dir?<br />
Ein 16 Bit Wert ist folgendermaßen aufgebaut.</p>
<pre><code>16 Bit
Hi                      Low
15 14 13 12 11 10 09 08 07 06 05 04 03 02 01 00
</code></pre>
<p>Hi und Low sind zwei 8 Bit Werte. Wenn jetzt sizeof(BYTE) 1 ist, kann man Folgendes machen:</p>
<pre><code class="language-cpp">s=(BYTE)c; // Low wird geschrieben
s&lt;&lt;=8;  // bedeutet s = s&lt;&lt;8; es ist eben ein Linksshift um 8 Stellen,
        // dabei wird ausgenutzt, dass von rechts Nullen nachgeschoben werden.
        // Hi ist nun durch den Wert in Low besetzt, Low wird null (alle Bits von 07-00)
s|=(BYTE)c; // hier hätte man auch s+=(BYTE)c schreiben können, die unteren 8 Bit 
            // werden geschrieben und der komplette 16 Bit Wert ist konstruiert
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1964887</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1964887</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Wed, 13 Oct 2010 10:57:14 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 13 Oct 2010 14:05:38 GMT]]></title><description><![CDATA[<p>Ja, das einlesen der Werte hat funktioniert!<br />
Danke für die Erklärung der Operatoren <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /><br />
Also wir brauchten 16 Bit um den Wert zu speichern, deswegen lesen wir die ersten 8 aus, dann machen wir einen linksshift, um &quot;Platz&quot; zu machen und dann addieren wir die restlichen 8 Bit auf die Variable?</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965047</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965047</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Wed, 13 Oct 2010 14:05:38 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 13 Oct 2010 15:41:34 GMT]]></title><description><![CDATA[<p>Nimm die &quot;magic number&quot; eines jpgs.</p>
<pre><code>FFD8 einlesen
BYTE einlesen -&gt; FF
unsigned short s = FF LOBYTE(s)=FF, HIBYTE(s)=0
s&lt;&lt;=8; // HIBYTE(s)=FF, LOBYTE(s)=0
nächstes BYTE einlesen -&gt; D8
s|=D8 // HIBYTE(s)=FF, LOBYTE(s)=D8, also s=FFD8
</code></pre>
<p>Edit: Es geht hier nicht um &quot;Platz schaffen&quot;, sondern darum, den Wert richtig abzuspeichern. Du brauchst bspw. die Breite des Bildes. Wenn diese größer als 255 (0xFF) ist, dann werden beide Bytes benötigt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1965073</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1965073</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Wed, 13 Oct 2010 15:41:34 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Mon, 18 Oct 2010 18:41:37 GMT]]></title><description><![CDATA[<p>So, wieder eine Menge verstanden, wieder ein Problem o:<br />
Ich erstelle eine Struct um Werte aus einer ZIP Datei zu lesen. Gemäß diesem Modell von Wikipedia(<a href="http://en.wikipedia.org/wiki/ZIP_%28file_format%29#File_headers" rel="nofollow">http://en.wikipedia.org/wiki/ZIP_%28file_format%29#File_headers</a>)<br />
Meine Struct sieht dementsprechend aus:</p>
<pre><code class="language-cpp">struct zipRecord{               //Structure of file records
    char frSignature[4];
    unsigned short frVersion;
    unsigned short frFlags;
    unsigned short frCompression;
    unsigned short frFileTime;
    unsigned short frFileDate;
    unsigned int frCRC;
    unsigned int frCompressedSize;
    unsigned int frUncompressedSize;
    unsigned short frFileNameLength;
    unsigned short frExtraFieldLength;
};
</code></pre>
<p>Dann überprüfe ich ob es sich um eine zip datei handelt indem ich den Signaturwert auswerte, das funktioniert auch prächtig...<br />
Dannach versuche ich den CRC Wert zu ermitteln indem ich die Werte in die Struct lese und dann auf frCRC zugreife.</p>
<pre><code class="language-cpp">zipRecord oRecord
in.seekg(0,ios::beg);
in.read((char*)&amp;oRecord,sizeof(oRecord));
printf(&quot;CRC Checksumme: %X \n&quot;,oRecord.frCRC);
</code></pre>
<p>Der Wert in der Datei ist FFE73F0C, der Wert der ausgelesen wird ist allerdings 52FFE7....<br />
Alle Werte vor frFileTime sind auch korrekt, nur dannach stimmt nichts mehr o:<br />
Ich habe auch mal mit sizeof(oRecord) die größe der Struct analysiert, ich erwartete 30 Bytes, raus kamen allerdings 32, das würde die Verschiebung der Werte erklärung, aber wo bleiben sind die anderen 2 Bytes versteckt? Die Summe der Dateitypgrößen ist 30, das steht fest.<br />
Ich bitte nochmals um Hilfe,<br />
Xdab4yaX</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967254</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967254</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Mon, 18 Oct 2010 18:41:37 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 20 Oct 2010 09:34:59 GMT]]></title><description><![CDATA[<p>push...</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1967903</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1967903</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Wed, 20 Oct 2010 09:34:59 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Wed, 20 Oct 2010 13:24:01 GMT]]></title><description><![CDATA[<p>Im Hexeditor siehst du die Werte, wie sie tatsächlich im Speicher stehen. Du musst aber auf Systemen mit little endian eine Konvertierung durchführen.</p>
<pre><code>w1H W1L W2H W2L
-&gt;
W2L W2H W1L W1H
und
WH WL
-&gt;
WL WH
</code></pre>
<p>Das heisst, sowohl die beiden Words als auch die Bytes in den Words werden getauscht.<br />
Manchmal ist es notwendig, eine Konvertierung durchzuführen. Bspw. unterstützt das Exif-Format sowohl big- als auch little endian. Dann muss man sich eben so etwas schreiben:</p>
<pre><code class="language-cpp">void SwapBytes(unsigned int* pi)
{
	unsigned int i = *pi;
	unsigned int ui;
	ui = (i) &amp; 0xFF;
	ui&lt;&lt;=8;
	ui|= (i&gt;&gt;8) &amp; 0xFF;
	ui&lt;&lt;=8;
	ui|= (i&gt;&gt;16) &amp; 0xFF;
	ui&lt;&lt;=8;
	ui|= (i&gt;&gt;24) &amp; 0xFF;
	*pi = ui;
}
void SwapBytes(unsigned short* ps)
{
	unsigned short s = *ps;
	unsigned short us;
	us = (s) &amp; 0xFF;
	us&lt;&lt;=8;
	us|= (s&gt;&gt;8) &amp; 0xFF;
	*ps = us;
}
</code></pre>
<p>Dies führt die Konvertierung durch.<br />
Bspw. ist die Zip Signatur im Speicher 0x504B0304 und nicht 0x04034B50.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1968002</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1968002</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Wed, 20 Oct 2010 13:24:01 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 21 Oct 2010 13:49:42 GMT]]></title><description><![CDATA[<p>Gut. Jetzt siehts hier so aus:</p>
<pre><code class="language-cpp">SwapBytes(&amp;oRecord.frCRC);
printf(&quot;CRC Checksumme: %X\n&quot;,oRecord.frCRC);
</code></pre>
<blockquote>
<p>Ausgabe:<br />
CRC Checksumme: E7FF5200</p>
</blockquote>
<p>Das stimmt immer noch nicht <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f603.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--grinning_face_with_big_eyes"
      title=":D"
      alt="😃"
    /><br />
Aber da nach der CRC Summe die CompressedSize kommt und diese bei mir 0x52(82) groß ist, nehme ich an, dass die 4 Bytes der Compressed Size in meine CRC Checksumme mit reingerutscht sind. Warum das? o:</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1968521</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1968521</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Thu, 21 Oct 2010 13:49:42 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Thu, 21 Oct 2010 19:10:43 GMT]]></title><description><![CDATA[<p>Ich hatte ja geschrieben, dass SwapBytes aufgerufen werden kann, um die Variablen mit den Werten im Hexeditor einfacher zu vergleichen. Die Werte sind _ohne_ den Aufruf natürlich richtig.<br />
Und ja, zum falschen Einlsen:</p>
<pre><code class="language-cpp">struct zipRecord{               //Structure of file records
    char frSignature[4]; // 4 Bytes
    unsigned short frVersion; // 6
    unsigned short frFlags; // 8
    unsigned short frCompression; // 10
    unsigned short frFileTime; // 12
    unsigned short frFileDate; // 14  -&gt; 14%4!=0-&gt; der Compiler schiebt hier 2 Bytes ein
    unsigned int frCRC;
    unsigned int frCompressedSize;
    unsigned int frUncompressedSize;
    unsigned short frFileNameLength;
    unsigned short frExtraFieldLength;
};
</code></pre>
<p>In den Standardeinstellungen kann man das &quot;Padding&quot; einstellen, standardmäßig ist es bei mir 8, kann aber auch 4 sein.<br />
Warum die Entwickler des Formats das so gemacht haben, keine Ahnung.<br />
Mit <code>#pragma pack(push,2)</code> kann dieses Padding beim MSVC auf 2 gesetzt werden. Unter der Struktur sollte dann <code>#pragma pack(pop)</code> stehen, um den alten Wert wieder herzustellen.</p>
<p>Edit: Du kannst auch</p>
<pre><code class="language-cpp">void SwapBytes(unsigned int* pi);
// in
unsigned int SwapBytes(unsigned int i);
</code></pre>
<p>ändern, damit es sich nicht auf die Werte auswirkt.</p>
]]></description><link>https://www.c-plusplus.net/forum/post/1968544</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1968544</guid><dc:creator><![CDATA[Vicious Falcon]]></dc:creator><pubDate>Thu, 21 Oct 2010 19:10:43 GMT</pubDate></item><item><title><![CDATA[Reply to [gelöst]Binary File wird nicht geöffnet :&#x27;( on Fri, 22 Oct 2010 12:26:55 GMT]]></title><description><![CDATA[<p>So, ich habe jetzt das Programm fertiggestellt und wirklich einiges gelernt <img
      src="https://www.c-plusplus.net/forum/plugins/nodebb-plugin-emoji/emoji/emoji-one/1f642.png?v=ab1pehoraso"
      class="not-responsive emoji emoji-emoji-one emoji--slightly_smiling_face"
      title=":)"
      alt="🙂"
    /> Vielen Dank, hier ist mein Sourcecode:</p>
<blockquote>
<p>main.cpp</p>
</blockquote>
<pre><code class="language-cpp">#include &lt;iostream&gt;
#include &lt;fstream&gt;
#include &quot;funcs.h&quot;

using namespace std;

unsigned short frFileNameLength;
unsigned int frCompressedSize;
unsigned int frChecksum;
int main()
{
    ifstream oZip(&quot;C:\\Sample.zip&quot;,ios::binary);

    bool isValidZip = isZIP(oZip);

    if(isValidZip)
    {
        unsigned short numEntries = numberOfEntries(oZip);
        cout &lt;&lt; &quot;Gueltiges ZIP Format!&quot; &lt;&lt; endl;
        cout &lt;&lt; &quot;Zahl der Dateien: &quot; &lt;&lt; numEntries &lt;&lt; endl;
        for(int i=0;i&lt;numEntries;i++)
        {
            oZip.seekg(OFFSET_CRC, ios::cur);                                                       //Zur Checksumme springen
            oZip.read(reinterpret_cast&lt;char*&gt;(&amp;frChecksum),sizeof(int));                            //Wert auslesen

            oZip.read(reinterpret_cast&lt;char*&gt;(&amp;frCompressedSize),sizeof(int));

            oZip.seekg(4, ios::cur);
            oZip.read(reinterpret_cast&lt;char*&gt;(&amp;frFileNameLength), sizeof(short));                   //Größe des Dateinamens ermitteln

            char *frFileName = new char[(frFileNameLength+1)];                                      //Speicher für den Dateinamen reservieren

            oZip.seekg(2, ios::cur);
            oZip.read(&amp;(*frFileName),frFileNameLength);                                             //Dateinamen einlesen

            frFileName[11] = '\0';                                                                  //Null-Terminator an Dateinamen anhängen

            printf(&quot;Datei %d: %s (CRC Checksumme: %X)\n&quot;,(i+1),frFileName,frChecksum);                   //Daten ausgeben
            delete[] frFileName;                                                                    //Speicher für Dateinamen löschen

            oZip.seekg(frCompressedSize,ios::cur);                                                  //Den Data Block überspringen und nochmal anfangen
        }
    }
    else
    {
        cout &lt;&lt; &quot;Ungueltige Datei!&quot; &lt;&lt; endl;
        return 0;
    }
}
</code></pre>
<blockquote>
<p>funcs.h</p>
</blockquote>
<pre><code class="language-cpp">#ifndef FUNCS_H_INCLUDED
#define FUNCS_H_INCLUDED

#include &lt;fstream&gt;
#include &lt;iostream&gt;

#define OFFSET_SIGNATURE 0
#define OFFSET_VERSION 4
#define OFFSET_FLAGS 6
#define OFFSET_COMPRESSION 8
#define OFFSET_FILE_TIME 10
#define OFFSET_FILE_DATE 12
#define OFFSET_CRC 14
#define OFFSET_COMPRESSED_SIZE 18
#define OFFSET_UNCOMPRESSED_SIZE 22
#define OFFSET_FILE_NAME_LENGTH 26
#define OFFSET_EXTRA_FIELD_LENGTH 28
#define OFFSET_FILE_NAME 30

using namespace std;

typedef unsigned char BYTE;

enum COMPTYPE{                          //Compression type
    COMP_STORED,
    COMP_SHRUNK,
    COMP_REDUCED1,
    COMP_REDUCED2,
    COMP_REDUCED3,
    COMP_REDUCED4,
    COMP_IMPLODED,
    COMP_TOKEN,
    COMP_DEFLATE,
    COMP_DEFLATE64
};
void SwapBytes(unsigned int* pi)
{
    unsigned int i = *pi;
    unsigned int ui;
    ui = (i) &amp; 0xFF;
    ui&lt;&lt;=8;
    ui|= (i&gt;&gt;8) &amp; 0xFF;
    ui&lt;&lt;=8;
    ui|= (i&gt;&gt;16) &amp; 0xFF;
    ui&lt;&lt;=8;
    ui|= (i&gt;&gt;24) &amp; 0xFF;
    *pi = ui;
}

void SwapBytes(unsigned short* ps)
{
    unsigned short s = *ps;
    unsigned short us;
    us = (s) &amp; 0xFF;
    us&lt;&lt;=8;
    us|= (s&gt;&gt;8) &amp; 0xFF;
    *ps = us;
}

unsigned short GetWord(ifstream&amp; in)
{
    char c;
    unsigned short s;
    in.get(c);
    s=(BYTE)c;
    s&lt;&lt;=8;
    in.get(c);
    s|=(BYTE)c;
    return s;
}
unsigned short GetByte(ifstream&amp; in)
{
    char c;
    unsigned short s;
    in.get(c);
    s=(BYTE)c;
    return s;
}
bool isZIP(ifstream&amp; in)
{
    bool bFound = false;
    streampos startPos = in.tellg();
    in.seekg(0,ios::beg);
    while(!in.eof() &amp;&amp; !bFound)
    {
        char c;
        in.get(c);
        if((BYTE)c!=0x50)
            continue;
        in.get(c);
        if((BYTE)c!=0x4B)
            continue;
        else
        {
            bFound = true;
            in.seekg(startPos);
        }
    }
    return bFound;
}
unsigned short numberOfEntries(ifstream&amp; in)
{
    unsigned short num;
    streampos startPos = in.tellg();
    in.seekg(-12,ios::end);
    in.read(reinterpret_cast&lt;char*&gt;(&amp;num),sizeof(short));
    in.seekg(startPos,ios::beg);
    return num;
}
#endif // FUNCS_H_INCLUDED
</code></pre>
]]></description><link>https://www.c-plusplus.net/forum/post/1969086</link><guid isPermaLink="true">https://www.c-plusplus.net/forum/post/1969086</guid><dc:creator><![CDATA[Xdab4yaX]]></dc:creator><pubDate>Fri, 22 Oct 2010 12:26:55 GMT</pubDate></item></channel></rss>