1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181
|
/*=========================================================================
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 );
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;
}
|