Ask Question

Name:
Title:
Your Question:

Answer Question

Name:
Your Answer:
User Submitted Source Code!


Description:
  ithmb
Language: C/C++
Code:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <sys/stat.h>
#include <assert.h>
#include <stdint.h>

#define HIGHT  158
#define WIDTH  160
#define POINTSIZE 2
#define BMPSIZE (HIGHT*WIDTH*POINTSIZE)
#define BMPOFFSET 28

static uint8_t bmphead[54] = {
    0x42, 0x4D, 0xB6, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x28, 0x00,
    0x00, 0x00, 0xA0, 0x00, 0x00, 0x00, 0x9E, 0x00, 0x00, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x80, 0xC5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00
};

static void write_one_bmp(int *bmpdata, int count);

static long get_file_size(const char *path)
{
    long  filesize = 0;
    FILE *fp       = NULL;
    int   ret      = 0;

    fp = fopen(path, "r");
    assert(fp != NULL);

    ret = fseek(fp, 0L, SEEK_END);
    assert(ret == 0);

    filesize = ftell(fp);
    assert(filesize != -1);

    ret = fclose(fp);
    assert(ret == 0);

    return filesize;
}

static void read_ithmb_file(const char *filename )
{
    int *bmpdata = NULL;
    FILE *fp      = NULL;
    int   cur_num = 0;
    long  cur_offset = 0;
    long  totalsize  = 0;
    int   ret        = 0;
    size_t ret_size  = 0;

    totalsize = get_file_size(filename);
    bmpdata = malloc(BMPSIZE + BMPOFFSET);
    assert(bmpdata != NULL);
    memset(bmpdata, 0,  BMPSIZE + BMPOFFSET);

    fp = fopen(filename, "r");
    assert(fp != NULL);

    for (;;) {
        if (cur_offset >= totalsize)
            break;
        ret_size = fread(bmpdata, 1, BMPSIZE + BMPOFFSET, fp);
        assert(ret_size == 1 *(BMPSIZE + BMPOFFSET) );
        cur_offset += BMPSIZE + BMPOFFSET;
        cur_num++;
        write_one_bmp(bmpdata, cur_num);
    }
    ret = fclose(fp);
    assert(ret == 0);
    free(bmpdata);
}

static void write_one_bmp(int *bmpdata, int count)
{
    FILE *fp = NULL;
    char  tmp_file_name[1024];
    int   ret = 0;
    size_t ret_size  = 0;

    memset(tmp_file_name, 0, 1024);
    ret = snprintf(tmp_file_name, 1023, "%s/%d%s", "output", count, ".bmp");
    assert(ret < 1023);

    ret = mkdir("output", 0777);
    assert(ret == -1 || ret == 0);

    fp = fopen(tmp_file_name, "w");
    assert(fp != NULL);

    ret_size = fwrite(bmphead, 1, sizeof(bmphead), fp);
    assert(ret_size == 1 * sizeof(bmphead));

    ret_size = fwrite(bmpdata, 1, BMPSIZE, fp);
    assert(ret_size == 1 * BMPSIZE);

    ret = fclose(fp);
    assert(ret == 0);

    printf("create file "%s" successn", tmp_file_name);

    return;
}

int main(int argc, char *argv[])
{
    char *filename;

    if (argc != 2){
        printf("useage: ./ithmb filenamen");
        return 0;
    }
    filename = argv[1];
    read_ithmb_file(filename);
    return 0;
}

          
Comments: