[Dcmlib] Incoherence de longueur de champ

Jean-Pierre Roux jpr at creatis.insa-lyon.fr
Fri Nov 5 17:53:03 CET 2004


Mathieu Malaterre wrote:

>
> Donc je voudrais ajouter une notion de DicomString dans gdcmUtil:
> /**
>  * \ingroup Util
>  * \brief Create a /DICOM/ string:
>  * It should a of even lenght (no odd lenght ever)
>  * It can contains as many \0 as you want.
>  * This function is similar to DicomString(const char*), except it 
> doesn't
>  * take a lenght. It only pad with a null character if legnth is odd
>  */
> std::string Util::DicomString(const char* s)
> {
>    size_t l = strlen(s);
>    if( l%2 )
>    {
>       l++;
>    }
>    std::string r(s, s+l);
>    assert( !(r.size() % 2) );
>    return r;
> }
>
> /**
>  * \ingroup Util
>  * \brief Create a /DICOM/ string:
>  * It should a of even lenght (no odd lenght ever)
>  * It can contains as many \0 as you want.
>  */
> std::string Util::DicomString(const char* s, size_t l)
> {
>    std::string r(s, s+l);
>    assert( !(r.size() % 2) );
>    return r;
> }
>
>
> L'avantage c'est qu'ensuite au moment de l'ecriture on peut toujours 
> comparer la taille de la string par rapport a GetReadLenght() et faire 
> un assert (j'aime bien les assert car ca n'a pas de cout en Release). 
> Je pense que la classe gdcmValEntry doit vraiment avoir la notion de 
> 'DicomString', pas de chaine ayant un nombre impaire de caractere. 
> Pour l'instant je ne peux pas obliger ca a cause des chaines du genre:
>
> "19785\8257\17747\8273"

Cette chaine ne sera jamais ecrite sur disque.
Elle figurait sous forme de 4 uint16_t (longueur 8) sur disque;
'Légitimement', ca aurait du etre une BinEntry.
On l'a convertie (ainsi que tous les entiers - si tu regardes une image 
512x512, tu auras Row Number qui vaut , ca tombe bien, "512") en chaine 
de caracteres pour faciliter la vie a Python.

Lorsqu'on ecrira Row Number sur disque, on le transformera en 0x(0200).
Pareil pour la "chaine" "19785\8257\17747\8273"

JP

>
>
> J'aurais preferer une notion de gdcmValVectorEntry...
>
> Mathieu
> Ps: j'ai bine l'impression que l'on ecrivait sur le disque de la 
> memoire aleatoire jusqu'a present. Et ca passait car std::string en 
> Debug doit mettre un packet de zero sous linux, mais par sous win32:
>
> http://public.kitware.com/Public/Sites/DASH3.kitware/GDCM-Win32-vs60/20041105-0100-Nightly/Test.html 
>
>
>
> (*)
>   // We need an additional byte for storing \0 that is not on disk
>    char *str = new char[length+1];
>    Fp->read(str, (size_t)length);
>    str[length] = '\0';
>    std::string newValue = str;
>    delete[] str;
>
>    if ( ValEntry* valEntry = dynamic_cast<ValEntry* >(entry) )
>    {
>       if ( Fp->fail() || Fp->eof())//Fp->gcount() == 1
>       {
>          dbg.Verbose(1, "Document::LoadDocEntry",
>                         "unread element value");
>          valEntry->SetValue(GDCM_UNREAD);
>          return;
>       }
>
>       if( vr == "UI" )
>       {
>          // Because of correspondance with the VR dic
>          valEntry->SetValue(newValue);
>       }
>       else
>       {
>          valEntry->SetValue(newValue);
>       }
>    }
>
>
>
>
>
> _______________________________________________
> Dcmlib mailing list
> Dcmlib at creatis.insa-lyon.fr
> http://www.creatis.insa-lyon.fr/mailman/listinfo/dcmlib
>



More information about the Dcmlib mailing list