[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