You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
242 lines
4.5 KiB
C++
242 lines
4.5 KiB
C++
/*=========================================================================
|
|
|
|
Program: DICOMParser
|
|
Module: DICOMFile.h
|
|
Language: C++
|
|
|
|
Copyright (c) 2003 Matt Turek
|
|
All rights reserved.
|
|
See Copyright.txt 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.
|
|
|
|
=========================================================================*/
|
|
|
|
#ifndef __DICOMFILE_H_
|
|
#define __DICOMFILE_H_
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(disable : 4514)
|
|
#pragma warning(push, 3)
|
|
#endif
|
|
|
|
#if defined(__BORLANDC__) && (__BORLANDC__ < 0x660)
|
|
#pragma warn - 8027 /* functions containing while are not expanded inline */
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string>
|
|
|
|
#include "DICOMConfig.h"
|
|
#include "DICOMTypes.h"
|
|
|
|
//
|
|
// Abstraction of a file used by the DICOMParser.
|
|
// This should probably be cleaned up so that it
|
|
// can be used to abstract a stream.
|
|
//
|
|
class DICOM_EXPORT DICOMFile
|
|
{
|
|
public:
|
|
DICOMFile();
|
|
virtual ~DICOMFile();
|
|
|
|
//
|
|
// Open a file with filename. Returns a bool
|
|
// that is true if the file is successfully
|
|
// opened.
|
|
//
|
|
bool Open(const dicom_stl::string& filename);
|
|
|
|
//
|
|
// Close a file.
|
|
//
|
|
void Close();
|
|
|
|
//
|
|
// Return the position in the file.
|
|
//
|
|
long Tell();
|
|
|
|
//
|
|
// Move to a particular position in the file.
|
|
//
|
|
void SkipToPos(long);
|
|
|
|
//
|
|
// Return the size of the file.
|
|
//
|
|
long GetSize();
|
|
|
|
//
|
|
// Skip a number of bytes.
|
|
//
|
|
void Skip(long);
|
|
|
|
//
|
|
// Skip to the beginning of the file.
|
|
//
|
|
void SkipToStart();
|
|
|
|
//
|
|
// Read data of length len.
|
|
//
|
|
void Read(void* data, long len);
|
|
|
|
//
|
|
// Read a double byte of data.
|
|
//
|
|
doublebyte ReadDoubleByte();
|
|
|
|
doublebyte ReadDoubleByteAsLittleEndian();
|
|
|
|
//
|
|
// Read a quadbyte of data.
|
|
//
|
|
quadbyte ReadQuadByte();
|
|
|
|
//
|
|
// Read nbytes of data up to 4 bytes.
|
|
//
|
|
quadbyte ReadNBytes(int len);
|
|
|
|
//
|
|
// Read a float an ascii.
|
|
//
|
|
float ReadAsciiFloat(int len);
|
|
|
|
//
|
|
// Read an int as ascii.
|
|
//
|
|
int ReadAsciiInt(int len);
|
|
|
|
//
|
|
// Read an array of ascii characters.
|
|
//
|
|
char* ReadAsciiCharArray(int len);
|
|
|
|
//
|
|
// Convert the data to signed long.
|
|
//
|
|
static int ReturnAsSignedLong(unsigned char* data, bool)
|
|
{
|
|
return *reinterpret_cast<quadbyte*>(data);
|
|
}
|
|
|
|
//
|
|
// Convert the data to unsigned long.
|
|
//
|
|
static uint ReturnAsUnsignedLong(unsigned char* data, bool)
|
|
{
|
|
return static_cast<uint>(*reinterpret_cast<ulong*>(data));
|
|
}
|
|
|
|
//
|
|
// Convert data to unsigned short.
|
|
//
|
|
static ushort ReturnAsUnsignedShort(unsigned char* data, bool)
|
|
{
|
|
return *reinterpret_cast<doublebyte*>(data);
|
|
}
|
|
|
|
//
|
|
// Convert data to signed short.
|
|
//
|
|
static short int ReturnAsSignedShort(unsigned char* data, bool)
|
|
{
|
|
return *reinterpret_cast<short int*>(data);
|
|
}
|
|
|
|
//
|
|
// Convert data to int.
|
|
//
|
|
static int ReturnAsInteger(unsigned char* data, bool)
|
|
{
|
|
return atoi(reinterpret_cast<const char*>(data));
|
|
}
|
|
|
|
static float ReturnAsFloat(unsigned char* data, bool)
|
|
{
|
|
return static_cast<float>(atof(reinterpret_cast<const char*>(data)));
|
|
}
|
|
|
|
bool GetPlatformIsBigEndian() { return PlatformIsBigEndian; }
|
|
|
|
void SetPlatformIsBigEndian(bool v) { this->PlatformIsBigEndian = v; }
|
|
|
|
//
|
|
// Swap the bytes in an array of unsigned shorts.
|
|
//
|
|
static void swap2(ushort* ip, ushort* op, int count)
|
|
{
|
|
while (count)
|
|
{
|
|
*op++ = swap2(*ip++);
|
|
count--;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Swap the bytes in an array of unsigned longs.
|
|
//
|
|
static void swap4(uint* ip, uint* op, int count)
|
|
{
|
|
while (count)
|
|
{
|
|
*op++ = swap4(*ip++);
|
|
count--;
|
|
}
|
|
}
|
|
|
|
//
|
|
// Swap the bytes in an unsigned short.
|
|
//
|
|
static ushort swap2(ushort v) { return ushort((v << 8) | (v >> 8)); }
|
|
|
|
//
|
|
// Swap the bytes in an unsigned long.
|
|
//
|
|
static uint swap4(uint v)
|
|
{
|
|
return uint((v << 24) | ((v << 8) & 0x00ff0000) | ((v >> 8) & 0x0000ff00) | ((v >> 24)));
|
|
}
|
|
|
|
const char* GetPlatformEndian() { return this->PlatformEndian; }
|
|
|
|
protected:
|
|
//
|
|
// Internal storage for the filename.
|
|
//
|
|
// char* Filename;
|
|
|
|
//
|
|
// Internal storage for the file pointer.
|
|
//
|
|
// FILE* Fptr;
|
|
|
|
dicom_stream::ifstream InputStream;
|
|
|
|
//
|
|
// Flag for swapping bytes.
|
|
//
|
|
bool PlatformIsBigEndian;
|
|
|
|
//
|
|
// Platform endianness
|
|
//
|
|
const char* PlatformEndian;
|
|
|
|
private:
|
|
DICOMFile(const DICOMFile&);
|
|
void operator=(const DICOMFile&);
|
|
};
|
|
|
|
#ifdef _MSC_VER
|
|
#pragma warning(pop)
|
|
#endif
|
|
|
|
#endif // __DICOMFILE_H_
|