On July 16, 2014 2:02:27 PM CEST, FRIGN <d...@frign.de> wrote:
>On Tue, 15 Jul 2014 20:40:08 +0200
>Markus Teich <markus.te...@stusta.mhn.de> wrote:
>
>> I hope this explains my issue.
>
>The definition is ambiguous and I start to get the impression the guy
>who defined this format had a naive view on what a "blank" is:
>Just a normal whitepace (0x20), as you already suspected.
>
>We now have two options: Either really define what should be put as a
>delimiter, or just don't care.
>Easiest to parse directly is using 0x00, but this is not very
>comfortable once you want to write an image-header.
>
>Another thing that bugs me is the inflexiblity of the width and
>height-definition. 99% of all images have at most coordinates < 9999,
>which means that you waste 10 bytes of image size on 99% of all images,
>because every number is zero-padded.
>
>Why not do it like this:
>
>9   "imagefile"
>1   0x20
>var width
>1   0x20
>var height
>1   0x00
>
>and work with it like this:
>
>char *
>readimage(int fd, int *w, int *h)
>{
>       size_t s;
>       uint8_t c, *p, *data;
>
>       for(s = 0; !s || c && s < SIZE_MAX; ++s){
>               if(!read(fd, &c, 1))
>                       return NULL;
>       }
>
>       if (s < 9 || !(data = malloc(s)) || lseek(fd, 0, SEEK_SET) == -1
>            || read(fd, buf, s) != s || strncmp("imagefile", data, 9)
>            || !(p = strtok(data, " ") || !(*w = atoi(p))
>            || !(p = strtok(p, " ") || !(*h = atoi(p)) ) {
>               free(data);
>               return NULL;
>       }
>
>       s = (*w) * (*h) * 4;
>       free(data);
>       data = malloc(data, s); 
>       if (!data || read(fd, data, s) != s) {
>               free(data);
>               return NULL;
>       }
>       return data;
>}
>
>This implementation allows arbitrary-size width and height values while
>remaining relatively simple at the same time.
>
>imagefile 800 600^@[data]
>
>vs
>
>imagefile 000000800 000000600^@[data]
>
>There may be some overhead, but it is the most flexible solution, as it
>both allows simple files with no zero-padding in the values and is a
>bit
>stricter when it comes to the header format (and fails in case it's
>malformed instead of just taking what's there and failing silently).
>
>Just imagine some person in the year 2140 who can't save his
>2000000000x3000000 image, because we didn't take care of that and fixed
>the number-width. :P
>
>Let me know what you think.
>
>Cheers
>
>FRIGN

Pathetic. Why would you do that to  save at most 16 bytes?
Reasons against it:
0. This implementation is way cooler.
1. Storage is cheap.
2. Compression.

If anything, I would store the numbers as unsigned 64 bit LSB and change the 
read/write functions for MSB architectures.

Reply via email to