[vsipl++] Matlab IO

Assem Salama assem at codesourcery.com
Tue Jun 20 23:30:33 UTC 2006


Jules,
  I don't understand. The endian field is a string, not a 16 bit 
value... I tried as a test to switch the endian field and swap the data 
and it works fine...

Thanks,
Assem

Jules Bergmann wrote:
> Assem Salama wrote:
>> Everyone,
>>  This is the new Matlab IO patch addressing Stefan and Jule's issues.
>
> Assem,
>
> The corrections from the previous patch look good, however the new 
> bits for handling byte-ordering need a couple of changes.
>
> First, you need to read and write the endian word as a single 16-bit 
> value (instead of as 2 8-bit values).  This way, the system byte-order 
> will be reflected in the value on disk.  (The current code writes the 
> endian word out as individual 8-bit values, which results in the same 
> value on disk regardless of the system byte-ordering).
>
> To write the value:
>
>     uint16_t endian = 'M' << 8 | 'I';
>     o.write(&endian, sizeof(uint16_t);
>
> Likewise, to read the value back in:
>
>     uint16_t endian;
>     is.read(&endian, sizeof(uint16_t));
>
> Once you've read the value back in, you don't need to know the 
> byte-order of the host (the 'get_machine_endian' function isn't 
> necessary), you just need to know whether the byte-order is the same 
> as or different from the file.  You check this by examining the endian 
> word from the header.  If it is equivalent to 'MI', then the host and 
> file have the same byte-order (both little-endian or both 
> big-endian).  If it is equivalent to 'IM', then the host and file have 
> different byte orders, and you need to byte swap.
>
>     ... read in endian ...
>     if (endian == 'M' << 8 | 'I')
>        // The system and file have same byte-order,
>        // so we don't need to swizzle bytes.
>        byte_swap = 0;
>     else if (endian == 'I' << 8 | 'M')
>        // The system and file have different byte-orders,
>        // so we need to swizzle bytes.
>        byte_swap = 1;
>     else
>        // Something bad happened, we expect to see either
>        // 'MI' or 'IM'.
>        throw ...
>
> Second, If the system and file have different byte-ordering, than you 
> need to swap bytes for *all* multi-byte values read in, including the 
> header fields for type, size, matrix dimensionality, etc, not just for 
> data values.
>
>                 -- Jules
>
>




More information about the vsipl++ mailing list