[Dcmlib] [Gdcm2] Re: gdcm2 : Tag

Mathieu Malaterre mathieu.malaterre at kitware.com
Wed Jan 4 18:55:31 CET 2006


C'etait l'inverse que je voulais faire bien sur ! Dans les deux cas 
(little big endian) je veux :

Tag t(0x12345678) == Tag t(0x1234, 0x5678)

Pas eu le temps de vraiment poffiner tous les accesseurs. Bien vu.

Au fait maintenant qu'on est sur sourceforge tu peux creer des bug report:

http://sourceforge.net/projects/gdcm
-> Click 'Bugs'
-> http://sourceforge.net/tracker/?group_id=137895&atid=739587

Mathieu

Jean-Pierre Roux wrote:
> Salut, Mathieu.
> 
> Il y a un truc pas terrible, dans Tag, c'est que tu obliges 
> l'utilisateur a passer le uint32_t en faisant le 'swap byte' a la main, 
> en tenant compte qu'on est sur une machine LittleEndian.
> (cf : TestTag.cxx)
> Tu oblige l'utilsateur a ecrire :  const uint32_t tag = 0x56781234;
> const gdcm::Tag t4(tag);
> pour avoir en fait :
> (0x1234, 0x5678)
> 
> Ca n'est  *vraiment pas* user friendly, comme manip ...
> de plus, le constructeur :
>  Tag(uint32_t tag) { ElementTag.tag = tag; }
> ne marchera pas sur une machine BigEndian :
> un entier de valeur 0x56781234 serait stocké en memoire comme 0x56781234,
> et correspondrait au tag ( 0x5678,0x1234)
> 
> J'ai modifié le constructeur, pour qu'il fasse lui meme le swap, lorsque 
> c'est necessaire :
> 
>  Tag(uint32_t tag) {
> #ifndef GDCM_WORDS_BIGENDIAN
>  tag = ( (tag<<16) | (tag>>16) );
> #endif
>  ElementTag.tag = tag;
>  }
> L'utilisateur pourra alors passer, par exemple 0x12345678 s'il veut 
> creer un tag (0x1234, 0x5678).
> Ca aide ...
> 
> GetElementTag est également modifié, afin de renvoyer la même valeur que 
> celle que l'utilisateur a passé :
> 
>  uint32_t GetElementTag() const {
> #ifndef GDCM_WORDS_BIGENDIAN         return (ElementTag.tag<<16) | 
> (ElementTag.tag>>16);
> #else
>     return ElementTag.tag;
> #endif
> }
> 
> Tout se passe bien
> Si on ecrit sur disque :
>  uint32_t tag = t.GetElementTag();
>  f.write( (char*)&tag, sizeof(uint32_t));
> 
> on va envoyer sur disque le uint32_t tel qu'il est en mémoire, en tant 
> qu'uint32_t, donc inversé par rapport a sa representation memoire en 
> tant que tag :-)
> Si on le relit dans un entier avec read :
>  uint32_t itag;
>  i.read((char*)&itag, sizeof(uint32_t));
>  gdcm::Tag it(itag);
> C'est parfait (le constructeur fait le boulot ...)
> 
> Si on le relit dans un tag avec Read:
>  gdcm::Tag o;
>  gdcm::DICOMIStream gi;
>  gi.SetFileName( "/tmp/bla.bin" );
>  gi.Open();
>  gi.Read(o);
> La relecture va charger le tag avec une valeur erronnée.
> Et le constructeur n'est plus la pour faire le boulot, puisque IStream 
> &DICOMIStream::Read(Tag &t)
> charge directement t.ElementTag.tag.
> 
> Tu suis toujours ?
> 
> Ben ... moi je suis planté, là.
> :-(
> 
> Je vais voir si j'ai une idée lumineuse ... cette nuit.
> 
> JP
> 
> 
> 
> 
> 
> 



-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems?  Stop!  Download the new AJAX search engine that makes
searching your log files as easy as surfing the  web.  DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_idv37&alloc_id865&opÌk
_______________________________________________
Gdcm-developers mailing list
Gdcm-developers at lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/gdcm-developers




More information about the Dcmlib mailing list