/*========================================================================= 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/d/msg/comp.protocols.dicom/7IaIkT0ZG5U/k7LPu81VvAMJ */ #include "gdcmReader.h" #include "gdcmPrivateTag.h" #include "gdcmPrinter.h" #include "gdcmDictPrinter.h" #include #include #include #include static bool DumpToshibaDTI( const char * input, size_t len ) { static int i = 0; ++i; if( len % 2 ) return false; std::vector copy( input, input + len ); std::reverse( copy.begin(), copy.end() ); #if 0 std::ostringstream f; f << "debug" << i; std::ofstream of( f.str().c_str(), std::ios::binary ); of.write( ©[0], copy.size() ); of.close(); #else std::istringstream is; std::string dup( ©[0], copy.size() ); is.str( dup ); gdcm::File file; gdcm::FileMetaInformation & fmi = file.GetHeader(); fmi.SetDataSetTransferSyntax( gdcm::TransferSyntax::ExplicitVRLittleEndian ); gdcm::DataSet & ds = file.GetDataSet(); ds.Read( is ); //gdcm::DictPrinter p; gdcm::Printer p; p.SetFile( file ); p.SetColor( true ); p.Print( std::cout ); #endif return true; } 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(); // (0029,0010) ?? (LO) [PMTF INFORMATION DATA ] # 22,1 Private Creator // (0029,1001) ?? (SQ) (Sequence with undefined length) # u/l,1 ? const gdcm::PrivateTag tpmtf(0x0029,0x1,"PMTF INFORMATION DATA"); if( !ds.FindDataElement( tpmtf) ) return 1; const gdcm::DataElement& pmtf = ds.GetDataElement( tpmtf ); if ( pmtf.IsEmpty() ) return 1; gdcm::SmartPointer seq = pmtf.GetValueAsSQ(); if ( !seq || !seq->GetNumberOfItems() ) return 1; size_t n = seq->GetNumberOfItems(); for( size_t i = 1; i <= n; ++i ) { gdcm::Item &item = seq->GetItem(i); gdcm::DataSet &subds = item.GetNestedDataSet(); // (0029,0010) ?? (LO) [PMTF INFORMATION DATA ] # 22,1 Private Creator // (0029,1090) ?? (OB) 00\05\00\13\00\12\00\22\ # 202,1 ? const gdcm::PrivateTag tseq(0x0029,0x90,"PMTF INFORMATION DATA"); if( subds.FindDataElement( tseq ) ) { const gdcm::DataElement & de = subds.GetDataElement( tseq ); const gdcm::ByteValue * bv = de.GetByteValue(); if( !bv ) return 1; bool b = DumpToshibaDTI( bv->GetPointer(), bv->GetLength() ); if( !b ) return 1; } } return 0; }