Advertisement
Guest User

Untitled

a guest
Sep 17th, 2019
203
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.18 KB | None | 0 0
  1. #include "lab_png.h"
  2. #include "crc.h"
  3. #include "crc.c"
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <arpa/inet.h>
  7.  
  8. int is_png(U8 *buf) {
  9.   int png_bytes[8] = {137, 80, 78, 71, 13, 10, 26, 10}; // png decimal signature
  10.  
  11.   for (int i = 0; i < 8; i++) {
  12.     if (buf[i] != png_bytes[i]) {
  13.       return 0;
  14.     }
  15.   }
  16.  
  17.   return 1;
  18. }
  19.  
  20. int get_png_data_IHDR(struct data_IHDR *out, U8 *buf) {
  21.   U32 *dimen_buf = (U32 *) (buf + 16 * sizeof(U8));
  22.   out->width = ntohl(dimen_buf[0]);
  23.   out->height = ntohl(dimen_buf[1]);
  24.  
  25.   dimen_buf = NULL;
  26.   free(dimen_buf);
  27.   return 0;
  28. }
  29.  
  30. int main(int argc, char *argv[]) {
  31.   long int f_size;
  32.   FILE *f_ptr;
  33.   U8 *buf;
  34.  
  35.   f_ptr = fopen(argv[1], "rb");
  36.  
  37.   fseek(f_ptr, 0, SEEK_END);
  38.   f_size = ftell(f_ptr);
  39.   rewind(f_ptr);
  40.  
  41.   buf = (U8 *)malloc((f_size + 1) * sizeof(U8));
  42.   fread(buf, f_size, 1, f_ptr);
  43.   rewind(f_ptr);
  44.  
  45.   if (!is_png(buf)) {
  46.     printf("%s: Not a PNG file\n", argv[1]);
  47.     return 0;
  48.   }
  49.  
  50.   struct data_IHDR *ihdr = (struct data_IHDR*) malloc(sizeof(ihdr));
  51.   get_png_data_IHDR(ihdr, buf);
  52.   printf("%s: %d x %d\n", argv[1], ihdr->width, ihdr->height);
  53.  
  54.   buf = NULL;
  55.   f_ptr = NULL;
  56.  
  57.   return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement