[Insight-users] strncpy problem in itkAnalyzeImageIO.cxx

Hans Johnson hjohnson at psychiatry.uiowa.edu
Mon Jun 21 09:48:16 EDT 2004


Jill,

The header Meta-Data information is not handled implicitly by ITK, you
must explicitly handle that with your own code.  There is a mechanism to
attach Meta-Data to any ITK object, but the application programmer must
judiciously propogate that information through the pipelines to make
sure that it is preserved.  This may seem like a hassle, but it is
actually a well thought out design decision. 

This method is not very safe.  The std::string temp is not gaunteed to
have 10 elements in it, and this will cause a segmentation fault on
non-spm image types.  The "10" in the strncpy(dest,sorce,10) specifies
the following behavior: "copy source characters into dest until either a
'\0' is reached or 10 characters have been copied".  

For spm formatted images the originator field is not treated as a
character array (if temp=[0 128 0 128 0 64 0 0 0 0], that is 23
characters in it).  To use the SPM format you must create an 8-bit
unsigned array with 10 elements, and memcpy that into the originator
feild.  This would require a new metadata tag to be created and keyed
off of.

The SPM file format is a particularly nasty deviation from the Analyze
7.5 file format, and causes many people lots of headaches.  If you are
needing SPM, then you are probably doing functional imaging, and a cross
application functional imaging file format is being created. The
University of Iowa contributers hope to have an implementation of the
NIfTY file format early this fall http://nifti.nimh.nih.gov/.  

Good Luck,
Hans J. Johnson
hans-johnson at uiowa.edu


 

On Thu, 2004-06-17 at 17:19, Jill Goldschneider 327 wrote:
> Hi,
> 
> I have been having some problems writing Analyze (SPM extension I
> believe) formatted images where origin information is stored in
> the data_history's char originator[10] field.  (I believe this
> field was originally intended to hold a character string.)
> If I use the ImageReadWrite example with Dimension = 3, e.g.
>   ImageReadWrite image.hdr tmp.hdr
> tmp.hdr loses all of the information in the originator field,
> (and other fields as well).
> 
> What I've found, is that on a sun solaris8 system, strncpy is
> actually NOT copying all 10 requested characters:
> 
>     // try using [ 0 128 0 128 0 64 0 0 0 0 ] in tmp.c_str()
> 
>     strncpy(this->m_hdr.hist.originator,temp.c_str(),10);//Note this is necessary because the array is not necessarily null terminated.
> 
>     // look at contents of m_hdr.hist and temp.c_str,
>     // m_hdr.hist.originator is all 0!
> 
> If I change this statement, and all other strncpy statements
> in the itkAnalyzeImageIO.cxx file, to use memcpy
> 
>     memcpy(this->m_hdr.hist.originator,temp.c_str(),10);//Note this is necessary because the array is not necessarily null terminated.
> 
> then everything works much better.
> 
> Would someone please consider making this change?
> 
> Thanks,
> 
> Jill
> 
> _______________________________________________
> Insight-users mailing list
> Insight-users at itk.org
> http://www.itk.org/mailman/listinfo/insight-users
> 



More information about the Insight-users mailing list