/*========================================================================= Program: GDCM (Grassroots DICOM). A DICOM library Copyright (c) 2006-2011 Mathieu Malaterre All rights reserved. See Copyright.txt or http://gdcm.sourceforge.net/Copyright.html for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ /* * https://groups.google.com/forum/#!msg/comp.protocols.dicom/2kZ2lLP8EcM/WzjFrtjnAgAJ */ #include "gdcmReader.h" #include "gdcmPrivateTag.h" #include "gdcmPrinter.h" #include "gdcmDictPrinter.h" #include "gdcmCSAHeader.h" #include "gdcmBase64.h" #include "gdcmExplicitDataElement.h" #include "gdcmSwapper.h" #include "gdcmPrinter.h" #include #include #include #include int main(int argc, char *argv[]) { if( argc < 2 ) return 1; const char *filename = argv[1]; gdcm::Reader reader; reader.SetFileName( filename ); if( !reader.Read() ) { std::cerr << "Failed to read: " << filename << std::endl; return 1; } const gdcm::DataSet& ds = reader.GetFile().GetDataSet(); gdcm::CSAHeader csa; const gdcm::PrivateTag &t1 = csa.GetCSAImageHeaderInfoTag(); if( !ds.FindDataElement( t1 ) ) return 1; csa.LoadFromDataElement( ds.GetDataElement( t1 ) ); //const char name[] = "MRDiffusion"; const char name[] = "MR_ASL"; if( csa.FindCSAElementByName(name) ) { const gdcm::CSAElement & el = csa.GetCSAElementByName(name); const gdcm::ByteValue* bv = el.GetByteValue(); std::string str( bv->GetPointer(), bv->GetLength() ); str.erase(std::remove(str.begin(), str.end(), '\n'), str.end()); size_t dl = gdcm::Base64::GetDecodeLength( str.c_str(), str.size() ); std::vector buf; buf.resize( dl ); size_t dl2 = gdcm::Base64::Decode( &buf[0], buf.size(), str.c_str(), str.size() ); (void)dl2; std::stringstream ss; ss.str( std::string(&buf[0], buf.size()) ); gdcm::File file; gdcm::DataSet &ds2 = file.GetDataSet(); gdcm::DataElement xde; try { while( xde.Read( ss ) ) { ds2.Insert( xde ); } assert( ss.eof() ); } catch(std::exception &) { return 1; } gdcm::Printer p; p.SetFile( file ); p.Print(std::cout); } return 0; }