/*========================================================================= 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. =========================================================================*/ /* * Dump TOSHIBA MDW HEADER / Image Header Info */ #include "gdcmReader.h" #include "gdcmPrivateTag.h" #include "gdcmAttribute.h" #include "gdcmImageWriter.h" #include #include #include #include #include #include struct element { std::istream & read( std::istream & is ); }; std::istream & element::read( std::istream & is ) { static const uint32_t ref = 0xe000fffe; std::ostream &os = std::cout; if( is.eof() ) { return is; } uint32_t magic; if( !is.read( (char*)&magic, sizeof(magic) ) ) { return is; } //os << magic << std::endl; assert( magic == ref ); (void)ref; uint32_t l; is.read( (char*)&l, sizeof(l) ); //os << l << std::endl; char str[17]; str[16] = 0; is.read( str, 16 ); os << str << " (" << l << ")" << std::endl; std::vector bytes; bytes.resize( l - 16 ); if( !bytes.empty() ) { is.read( &bytes[0], l - 16 ); } //os << "pos:" << is.tellg() << std::endl; if( strcmp(str, "TUSREMEASUREMENT" ) == 0 ) { const char *p = &bytes[0]; uint32_t val; memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); #if 0 float f; memcpy( (char*)&f, p, sizeof(f) ); os << " " << f << std::endl; p += sizeof(f); #else memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); #endif memcpy( (char*)&val, p, sizeof(val) ); os << " " << val << std::endl; p += sizeof(val); char str2[17]; memcpy( str2, p, 16 ); str2[16] = 0; os << " " << str2 << std::endl; } #if 0 std::ofstream out( str, std::ios::binary ); out.write( (char*)&magic, sizeof( magic ) ); out.write( (char*)&l, sizeof( l ) ); out.write( str, 16 ); out.write( &bytes[0], bytes.size() ); #endif return is; } static bool DumpImageHeaderInfo( std::istream & is, size_t reflen ) { // TUSNONIMAGESTAM (5176) // TUSREMEASUREMEN (1352) // TUSBSINGLELAYOU (16) // TUSCLIPPARAMETE (104) element el; while( el.read( is ) ) { } //size_t pos = is.tellg(); //assert( pos == reflen ); (void)reflen; 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(); const gdcm::PrivateTag timageheaderinfo(0x0029,0x10,"TOSHIBA MDW HEADER"); if( !ds.FindDataElement( timageheaderinfo) ) return 1; const gdcm::DataElement& imageheaderinfo = ds.GetDataElement( timageheaderinfo ); if ( imageheaderinfo.IsEmpty() ) return 1; const gdcm::ByteValue * bv = imageheaderinfo.GetByteValue(); std::istringstream is; std::string dup( bv->GetPointer(), bv->GetLength() ); is.str( dup ); bool b = DumpImageHeaderInfo( is, bv->GetLength() ); if( !b ) return 1; #if 0 const float d1 = 0.0041666668839752674; // 89 88 88 3B // 0x44c //const float d1 = 0.053231674455417881; const float d2 = 0.10828025639057159; // 0A C2 DD 3D // 0x1ac //const float d1 = 0.17869562069272813; //const unsigned int d2 = 4294967280; const float d3 = 0.10828025639057159; // 0A C2 DD 3D // 0x15c const int32_t d4 = 134; const uint32_t d5 = 1153476; std::ofstream t("/tmp/debug", std::ios::binary ); //t.write( (char*)&d0, sizeof( d0 ) ); t.write( (char*)&d1, sizeof( d1 ) ); t.write( (char*)&d2, sizeof( d2 ) ); t.write( (char*)&d3, sizeof( d3 ) ); t.write( (char*)&d4, sizeof( d4 ) ); t.write( (char*)&d5, sizeof( d5 ) ); t.close(); #endif return 0; }