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 "gdcmImageWriter.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 ); (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<char> bytes;
bytes.resize( l - 16 );
if( !bytes.empty() )
{
is.read( bytes.data(), l - 16 );
}
//os << "pos:" << is.tellg() << std::endl;
if( strcmp(str, "TUSREMEASUREMENT" ) == 0 )
{
const char *p = bytes.data();
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;
}
gdcm::ByteValue
Class to represent binary value (array of bytes).
Definition gdcmByteValue.h:35
gdcm::ByteValue::GetPointer
const char * GetPointer() const
Definition gdcmByteValue.h:110
gdcm::ByteValue::GetLength
VL GetLength() const override
Definition gdcmByteValue.h:77
gdcm::DataElement
Class to represent a Data Element either Implicit or Explicit.
Definition gdcmDataElement.h:59
gdcm::DataElement::GetByteValue
const ByteValue * GetByteValue() const
Definition gdcmDataElement.h:133
gdcm::DataElement::IsEmpty
bool IsEmpty() const
Check if Data Element is empty.
Definition gdcmDataElement.h:106
gdcm::DataSet
Class to represent a Data Set (which contains Data Elements).
Definition gdcmDataSet.h:56
gdcm::DataSet::GetDataElement
const DataElement & GetDataElement(const Tag &t) const
Definition gdcmDataSet.h:188
gdcm::DataSet::FindDataElement
bool FindDataElement(const PrivateTag &t) const
Look up if private tag 't' is present in the dataset:
gdcm::File::GetDataSet
const DataSet & GetDataSet() const
Get Data Set.
Definition gdcmFile.h:57
gdcm::PrivateTag
Class to represent a Private DICOM Data Element (Attribute) Tag (Group, Element, Owner).
Definition gdcmPrivateTag.h:39
gdcm::Reader
Reader ala DOM (Document Object Model).
Definition gdcmReader.h:54
gdcm::Reader::GetFile
const File & GetFile() const
Set/Get File.
Definition gdcmReader.h:72
gdcm::Reader::Read
virtual bool Read()
Main function to read a file.
gdcm::Reader::SetFileName
void SetFileName(const char *filename_native)
gdcmAttribute.h
gdcmImageWriter.h
gdcmPrivateTag.h
gdcmReader.h