<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://dsibrew.org/w/index.php?action=history&amp;feed=atom&amp;title=User%3ALudo6431%2Fpit-read.c</id>
	<title>User:Ludo6431/pit-read.c - Revision history</title>
	<link rel="self" type="application/atom+xml" href="https://dsibrew.org/w/index.php?action=history&amp;feed=atom&amp;title=User%3ALudo6431%2Fpit-read.c"/>
	<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Ludo6431/pit-read.c&amp;action=history"/>
	<updated>2026-04-21T14:48:50Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://dsibrew.org/w/index.php?title=User:Ludo6431/pit-read.c&amp;diff=3418&amp;oldid=prev</id>
		<title>Ludo6431: Created page with &quot;&lt;source lang=&quot;c&quot;&gt; /*  *  pitread.c -- pit.bin file reader by Ludo6431 &lt;ludolacost_gm@il_com&gt;  */  #include &lt;stdlib.h&gt; #include &lt;stdio.h&gt; #include &lt;stdarg.h&gt; #include &lt;string.h&gt; #...&quot;</title>
		<link rel="alternate" type="text/html" href="https://dsibrew.org/w/index.php?title=User:Ludo6431/pit-read.c&amp;diff=3418&amp;oldid=prev"/>
		<updated>2011-01-30T22:47:22Z</updated>

		<summary type="html">&lt;p&gt;Created page with &amp;quot;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt; &lt;span class=&quot;autocomment&quot;&gt;*  pitread.c -- pit.bin file reader by Ludo6431 &amp;lt;ludolacost_gm@il_com&amp;gt;: &lt;/span&gt;  #include &amp;lt;stdlib.h&amp;gt; #include &amp;lt;stdio.h&amp;gt; #include &amp;lt;stdarg.h&amp;gt; #include &amp;lt;string.h&amp;gt; #...&amp;quot;&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;source lang=&amp;quot;c&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
 *  pitread.c -- pit.bin file reader by Ludo6431 &amp;lt;ludolacost_gm@il_com&amp;gt;&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdarg.h&amp;gt;&lt;br /&gt;
#include &amp;lt;string.h&amp;gt;&lt;br /&gt;
#include &amp;lt;time.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
typedef unsigned char u8;&lt;br /&gt;
typedef unsigned short u16;&lt;br /&gt;
typedef unsigned int u32;&lt;br /&gt;
#ifndef BIT&lt;br /&gt;
#   define BIT(b) (1&amp;lt;&amp;lt;(b))&lt;br /&gt;
#endif&lt;br /&gt;
&lt;br /&gt;
void mexit(int ret, char *format, ...) {&lt;br /&gt;
    if(format) {&lt;br /&gt;
        va_list ap;&lt;br /&gt;
        va_start(ap, format);&lt;br /&gt;
        vfprintf(stderr, format, ap);&lt;br /&gt;
        fprintf(stderr, &amp;quot;\n&amp;quot;);&lt;br /&gt;
        va_end(ap);&lt;br /&gt;
    }&lt;br /&gt;
    exit(ret);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
typedef struct PIT_HDR sPIT_HDR;&lt;br /&gt;
struct PIT_HDR {&lt;br /&gt;
    u32 magic;&lt;br /&gt;
    u32 dunno1;         // &amp;quot;00_1&amp;quot;&lt;br /&gt;
    u16 slotsnum;       // 3000 slots in the file&lt;br /&gt;
    u16 msbfolderctr;&lt;br /&gt;
    u16 lsbfolderctr;   // next folder&amp;#039;s number will be ++folderctr&lt;br /&gt;
    u16 photoctr;       // next photo&amp;#039;s number will be ++photoctr&lt;br /&gt;
    u16 dunno2;         // 0x0000&lt;br /&gt;
    u16 framectr;       // next frame&amp;#039;s number will be ++framectr&lt;br /&gt;
    u16 checksum;       // crc16 of whole file&lt;br /&gt;
    u16 hdrsize;        // 0x18&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
#define F_DIRNUM(f)     (((f)&amp;amp;0x1)*100 + ((f)&amp;gt;&amp;gt;1)&amp;amp;0x7f) // 8bits (100-129)&lt;br /&gt;
#define F_ENTNUM(f)     ((((f)&amp;gt;&amp;gt;11)&amp;amp;0x7f)+1)            // 7bits (0-99)&lt;br /&gt;
#define F_STICKER(f)    (((f)&amp;gt;&amp;gt;18)&amp;amp;0x3)&lt;br /&gt;
#define F_TYPE(f)       (((f)&amp;gt;&amp;gt;20)&amp;amp;0x1)&lt;br /&gt;
typedef struct PIT_ENTRY sPIT_ENTRY;&lt;br /&gt;
struct PIT_ENTRY {&lt;br /&gt;
    u32 date;&lt;br /&gt;
    u8 dunno[8];&lt;br /&gt;
    u32 flags; // (bit0: hundreds&amp;#039; digit of folder num; bit1-7: tens&amp;#039; digits of folder num; bit8-10: UNKNOWN (0); bit11-17: photo&amp;#039;s number minus 1; bit18-19: sticker 0: None, 1: Star, 2: Clover, 3: Heart; bit20: type 0:photo, 1:frame; bit21-31: UNKNOWN (0))&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    if(argc!=2) mexit(1, &amp;quot;Usage:\n\t%s &amp;lt;pit.bin&amp;gt;&amp;quot;, argv[0]);&lt;br /&gt;
&lt;br /&gt;
    char *fname = argv[1];&lt;br /&gt;
    FILE *fd = fopen(fname, &amp;quot;rb+&amp;quot;);&lt;br /&gt;
    if(!fd) mexit(1, &amp;quot;Can&amp;#039;t open file \&amp;quot;%s\&amp;quot;!&amp;quot;, fname);&lt;br /&gt;
&lt;br /&gt;
    fseek(fd, 0, SEEK_END);&lt;br /&gt;
    unsigned fsize = ftell(fd);&lt;br /&gt;
    rewind(fd);&lt;br /&gt;
&lt;br /&gt;
    sPIT_HDR hdr;&lt;br /&gt;
&lt;br /&gt;
    if(fread((void *)&amp;amp;hdr, 1, sizeof(sPIT_HDR), fd)!=sizeof(sPIT_HDR)) {&lt;br /&gt;
        fclose(fd);&lt;br /&gt;
        mexit(1, &amp;quot;Can&amp;#039;t read file \&amp;quot;%s\&amp;quot;!&amp;quot;, fname);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    printf(&amp;quot;magic       : \&amp;quot;%c%c%c%c\&amp;quot;\n&amp;quot;, hdr.magic&amp;gt;&amp;gt;24, (hdr.magic&amp;gt;&amp;gt;16)&amp;amp;0xFF, (hdr.magic&amp;gt;&amp;gt;8)&amp;amp;0xFF, hdr.magic&amp;amp;0xFF);&lt;br /&gt;
    printf(&amp;quot;dunno1      : \&amp;quot;%c%c%c%c\&amp;quot;\n&amp;quot;, hdr.dunno1&amp;amp;0xFF, (hdr.dunno1&amp;gt;&amp;gt;8)&amp;amp;0xFF, (hdr.dunno1&amp;gt;&amp;gt;16)&amp;amp;0xFF, hdr.dunno1&amp;gt;&amp;gt;24);&lt;br /&gt;
    printf(&amp;quot;slotsnum    : %d\n&amp;quot;, hdr.slotsnum);&lt;br /&gt;
    printf(&amp;quot;folderctr   : %d%02d\n&amp;quot;, hdr.msbfolderctr, hdr.lsbfolderctr);&lt;br /&gt;
    printf(&amp;quot;photoctr    : %d\n&amp;quot;, hdr.photoctr);&lt;br /&gt;
    printf(&amp;quot;framectr    : %d\n&amp;quot;, hdr.framectr);&lt;br /&gt;
    printf(&amp;quot;checksum    : 0x%02x\n&amp;quot;, hdr.checksum);&lt;br /&gt;
    printf(&amp;quot;headersize  : %d\n&amp;quot;, hdr.hdrsize);&lt;br /&gt;
&lt;br /&gt;
    // jump after the header&lt;br /&gt;
    fseek(fd, hdr.hdrsize, SEEK_SET);&lt;br /&gt;
&lt;br /&gt;
    u32 i, photocnt=0, framecnt=0, offset;&lt;br /&gt;
    sPIT_ENTRY entry;&lt;br /&gt;
    for(i=0; i&amp;lt;hdr.slotsnum; i++) {&lt;br /&gt;
        offset = ftell(fd);&lt;br /&gt;
        if(fread((void *)&amp;amp;entry, 1, sizeof(sPIT_ENTRY), fd)!=sizeof(sPIT_ENTRY)) {&lt;br /&gt;
            fclose(fd);&lt;br /&gt;
            mexit(1, &amp;quot;Can&amp;#039;t read file \&amp;quot;%s\&amp;quot; (after %d+%d valid entries)!&amp;quot;, fname, photocnt, framecnt);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if(!entry.date) continue;&lt;br /&gt;
&lt;br /&gt;
        switch(F_TYPE(entry.flags)) {&lt;br /&gt;
        case 0: // photo&lt;br /&gt;
            photocnt++;&lt;br /&gt;
            printf(&amp;quot;-- photo%04d -- (slot%d in file)\n&amp;quot;, photocnt, (offset-hdr.hdrsize)&amp;gt;&amp;gt;4);&lt;br /&gt;
            break;&lt;br /&gt;
        case 1: // frame&lt;br /&gt;
            framecnt++;&lt;br /&gt;
            printf(&amp;quot;-- frame%04d -- (slot%d in file)\n&amp;quot;, framecnt, (offset-hdr.hdrsize)&amp;gt;&amp;gt;4);&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        struct tm ttm;&lt;br /&gt;
        time_t stm;&lt;br /&gt;
        bzero(&amp;amp;ttm, sizeof(ttm));&lt;br /&gt;
        ttm.tm_year = 2000 - 1900;   // 2000&lt;br /&gt;
        ttm.tm_mon = 0;  // january&lt;br /&gt;
        ttm.tm_mday = 1; // 1st&lt;br /&gt;
        stm = mktime(&amp;amp;ttm);&lt;br /&gt;
        stm += entry.date;&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;  date(UTC) : %s&amp;quot;, asctime(gmtime(&amp;amp;stm)));&lt;br /&gt;
        printf(&amp;quot;  folder    : %d\n&amp;quot;, F_DIRNUM(entry.flags));&lt;br /&gt;
        printf(&amp;quot;  number    : %d\n&amp;quot;, F_ENTNUM(entry.flags));&lt;br /&gt;
&lt;br /&gt;
        char fname[128];&lt;br /&gt;
        switch(F_TYPE(entry.flags)) {&lt;br /&gt;
        case 0:&lt;br /&gt;
            printf(&amp;quot;  sticker   : %d\n&amp;quot;, F_STICKER(entry.flags));&lt;br /&gt;
            sprintf(fname, &amp;quot;/DCIM/%03dNIN02/HNI_%04d.JPG&amp;quot;, F_DIRNUM(entry.flags), F_ENTNUM(entry.flags));&lt;br /&gt;
            break;&lt;br /&gt;
        case 1:&lt;br /&gt;
            sprintf(fname, &amp;quot;/private/ds/app/484E494A/DCIM/%03dNIN02/HNI_%04d.JPG&amp;quot;, F_DIRNUM(entry.flags), F_ENTNUM(entry.flags));&lt;br /&gt;
            break;&lt;br /&gt;
        default:&lt;br /&gt;
            break;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        printf(&amp;quot;  filename  : %s\n&amp;quot;, fname);&lt;br /&gt;
    }&lt;br /&gt;
    printf(&amp;quot;The file contains %d photos and %d frames.\n&amp;quot;, photocnt, framecnt);&lt;br /&gt;
&lt;br /&gt;
    fclose(fd);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Ludo6431</name></author>
	</entry>
</feed>