Anonymous Monk has asked for the wisdom of the Perl Monks concerning the following question:

Hi, I'm somewhat embarrassed since I've been programming Perl for 7+ years now. I can't figure out how to flip a little-endian TIFF file created on a Windows 3.1 machine to a big-endian TIFF file readable on a Sun Solaris machine.

Right now I have this (as little2big), which doesn't work:

#!/usr/bin/perl die "Usage: $0 filename\n" unless @ARGV == 1; my $file = shift; my $buf; open IN, $file or die "Can't read $file: $!\n"; while (read(IN, $buf, 4)) { print pack "N", unpack "V", $buf; } close IN;
Then I try:
little2big little-endian.tif >big-endian.tif
When I do this, all I get is "data" as a file type.

I've also tried reading 2 bytes and then using the pack/unpack templates n/v, but it doesn't flip anything correctly.

What am I missing? I feel like a Dumass. Thanks...

-Nate

Replies are listed 'Best First'.
Re: How to flip little-endian TIFF to big-endian?
by Zaxo (Archbishop) on Dec 19, 2003 at 23:23 UTC

    According to my /usr/share/magic, the headers differ for the two, "II\x2A\x00" for little-endian (Intel), and "MM\x00\x2A" for big-endian (Motorola).

    Update: You have more against you than the header. TIFF files are tagged data, and part of the tag should not be reordered. Will follow up with specifics.

    Update: The TIFF header looks like this C struct,

    typedef struct { uint16 numbertype; uint16 version; uint32 offset; } TIFFHEAD;
    'offset' is the offset to the first tagged image library in the file. The tag is a structure like this:
    typedef struct { uint16 tag; uint16 type; uint32 length; uint32 offset; } TIFFTAG;
    Tags can nest. The data they contain is a mixture of types. A straightforward 32-bit conversion like you propose will clearly scramble the file. You need to get information about TIFF tag types and recursively unpack the files according to each tag's content.

    After Compline,
    Zaxo

      Zaxo,

      Thanks alot for the help. It turns out that flipping the TIFF file is not necessarily the problem I'm hitting here. In fact, I found this piece of text:

      Programmers working with bitmap files need to be concerned about byte order, because many popular formats such as Macintosh Paint (MacPaint), Interchange File Format (IFF or AmigaPaint), and SunRaster image files are always read and written in big-endian byte order. The TIFF file format is unique, however, in that any TIFF file can be written in either format, and any TIFF reader must be able to read either byte order correctly regardless of the system on which the code is executing.

      So, I'm going to pushback on the user. This is being generated from a very very very old piece of Windoze 3.1 software. I suspect it's generating dubious files. In fact, stuff like the GIMP, ImageMagick, etc can't properly identify the file.

      Thanks for all your help.

Re: How to flip little-endian TIFF to big-endian?
by oha (Friar) on Dec 19, 2003 at 23:36 UTC
    print pack "N*", unpack "V*", $buf;
      print pack "N*", unpack "V*", $buf;
      There was a discussion on endian conversion with pack/unpack earlier -> node 310075.