GDCM  2.2.6
DumpImageHeaderInfo.cxx
/*=========================================================================
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 <iostream>
#include <fstream>
#include <vector>
#include <string.h>
#include <assert.h>
#include <stdint.h>
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 );
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<char> bytes;
bytes.resize( l - 16 );
if( bytes.size() )
{
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;
}

Generated on Sat Dec 21 2013 05:56:14 for GDCM by doxygen 1.8.5
SourceForge.net Logo