00001
00002
00003
00004
00005
00006
00007 #ifdef USE_STD
00008 #include <iostream>
00009 #include <string>
00010 #include <algorithm>
00011 using namespace std;
00012 #else
00013 #include <iostream.h>
00014 #include <string.h>
00015 #include <algorithm.h>
00016 #endif
00017
00018 #include "utility.h"
00019
00020 void inttohex( int num, char* ptc, int len ) {
00021 const char* hexdigit="0123456789ABCDEF";
00022 char* pttmp=(char*)(&num);
00023 unsigned char c;
00024 int j=0;
00025
00026 for(int i = 0; i < min( len, int(sizeof(int) ) ); i++ ) {
00027 #ifdef STORM_RS6000_AIX
00028 c=pttmp[ sizeof(int) - len + i ];
00029 #endif
00030 #ifdef STORM_x86_LINUX
00031 c=pttmp[ len - 1 - i ];
00032 #endif
00033 #ifdef STORM_SGI_IRIX
00034 c=pttmp[ sizeof(int) - len + i ];
00035 #endif
00036 ptc[j++] = hexdigit[ int( ( c & 0xF0 ) >> 4 ) ];
00037 ptc[j++] = hexdigit[ int( ( c & 0x0F ) ) ];
00038 }
00039
00040 ptc[j]='\0';
00041
00042 }
00043
00044
00045 bytepack::bytepack( const int sizemax )
00046 : _sizemax(sizemax), _size(0)
00047 {
00048 _data = new char[ _sizemax + 1 ];
00049 _data[0] = 0;
00050 }
00051
00052 bytepack::bytepack( const bytepack& rhs )
00053 : _sizemax(rhs._sizemax), _size(rhs._size)
00054 {
00055 _data = new char[ _sizemax + 1 ];
00056 for( int i = 0; i < rhs._sizemax; ++i ) _data[i] = rhs._data[i];
00057 }
00058
00059 bytepack::~bytepack() { delete [] _data; _data = 0; }
00060
00061 bytepack& bytepack::operator()( const char data, const int size )
00062 {
00063 for( int i = 0; i <= size; i++ ) _data[i] = 0;
00064 _data[0] = data;
00065 _size = 1;
00066 return *this;
00067 }
00068
00069 bytepack& bytepack::operator()( const int data0, const int size ) {
00070 int data = data0;
00071 char* ptdata = (char*)(&data);
00072 for(int i=0;i<=size;i++) _data[i] = 0;
00073 #ifdef STORM_RS6000_AIX
00074 for(int i = 0; i < min( size, int(sizeof(int)) ); i++ ) {
00075 _data[i] = ptdata[ sizeof(int) - 1 - i ];
00076 }
00077 _size = size;
00078 #endif
00079 #ifdef STORM_x86_LINUX
00080 for( int i = 0; i < min( size, int(sizeof(int)) ); i++ ) {
00081 _data[i] = ptdata[i];
00082 }
00083 _size = size;
00084 #endif
00085 #ifdef STORM_SGI_IRIX
00086 for( int i = 0; i < min( size, int(sizeof(int)) ); i++ ) {
00087 _data[i] = ptdata[ sizeof(int) - 1 - i ];
00088 }
00089 _size = size;
00090 #endif
00091 return *this;
00092 }
00093
00094 bytepack& bytepack::operator()( const float data0, const int size ) {
00095 float data = data0;
00096 char* ptdata = (char*)(&data);
00097 for( int i = 0; i <= size; i++ ) _data[i] = 0;
00098 #ifdef STORM_RS6000_AIX
00099 for( int i = 0; i < min( size, int(sizeof(float)) ); i++ ) {
00100 _data[i] = ptdata[i];
00101 }
00102 _size = size;
00103 #endif
00104 #ifdef STORM_x86_LINUX
00105 for( int i = 0 ; i < min( size, int(sizeof(float)) ); i++ ) {
00106 _data[i] = ptdata[ sizeof(float) - 1 - i ];
00107 }
00108 _size = size;
00109 #endif
00110 #ifdef STORM_SGI_IRIX
00111 for( i = 0; i < min( size, int(sizeof(float)) ); i++ ) {
00112 _data[i] = ptdata[i];
00113 }
00114 _size = size;
00115 #endif
00116 return *this;
00117 }
00118
00119 bytepack& bytepack::operator()( const double data0, const int size ) {
00120 double data = data0;
00121 char* ptdata = (char*)(&data);
00122 for( int i = 0; i <= size; i++ ) _data[i] = 0;
00123 #ifdef STORM_RS6000_AIX
00124 for( int i = 0; i < min( size, int(sizeof(double)) ); i++ ) {
00125 _data[i] = ptdata[i];
00126 }
00127 _size = size;
00128 #endif
00129 #ifdef STORM_x86_LINUX
00130 for( int i = 0; i < min( size, int(sizeof(double)) ); i++ ) {
00131 _data[i] = ptdata[ sizeof(double) - 1 - i ];
00132 }
00133 _size = size;
00134 #endif
00135 #ifdef STORM_SGI_IRIX
00136 for( int i = 0; i < min( size, int(sizeof(double)) ); i++ ) {
00137 _data[i] = ptdata[i];
00138 }
00139 _size = size;
00140 #endif
00141 return *this;
00142 }
00143
00144 bytepack& bytepack::operator = ( const bytepack bp )
00145 {
00146 _sizemax = bp._sizemax;
00147 if ( _data != 0 ) delete [] _data;
00148 _data = new char[ _sizemax + 1 ];
00149 _size = bp._size;
00150 for( int i = 0; i < ( _sizemax + 1); ++i ) _data[i] = bp._data[i];
00151 return *this;
00152 }
00153
00154 bytepack::operator char() { return char(_data[0]); }
00155
00156 bytepack::operator int() {
00157 int data;
00158 char* ptdata = (char*)(&data);
00159 if ((_data[_size-1]&0x80)) {
00160 for( int i = 0; i < (int)sizeof(int); i++ ) ptdata[i] = 0xFF;
00161 }
00162 else {
00163 for( int i = 0; i < (int)sizeof(int); i++ ) ptdata[i] = 0x00;
00164 }
00165 #ifdef STORM_RS6000_AIX
00166 for( int i = 0; i < min( _size, int(sizeof(int)) ); i++ ) {
00167 ptdata[ sizeof(int) - 1 - i ] = _data[i];
00168 }
00169 #endif
00170 #ifdef STORM_x86_LINUX
00171 for( int i = 0; i < min( _size, int(sizeof(int)) ); i++ ) {
00172 ptdata[i] = _data[i];
00173 }
00174 #endif
00175 #ifdef STORM_SGI_IRIX
00176 for( int i = 0; i < min( _size, int(sizeof(int)) ); i++ ) {
00177 ptdata[ sizeof(int) - 1 - i ] = _data[i];
00178 }
00179 #endif
00180 return data;
00181 }
00182
00183 bytepack::operator float() {
00184 float data = 0;
00185 char* ptdata = (char*)(&data);
00186 #ifdef STORM_RS6000_AIX
00187 for( int i = 0; i < min( _size, int(sizeof(float)) ); i++ ) {
00188 ptdata[i] = _data[i];
00189 }
00190 #endif
00191 #ifdef STORM_x86_LINUX
00192 for( int i = 0; i < min( _size, int(sizeof(float)) ); i++ ) {
00193 ptdata[ sizeof(float) - 1 - i ] = _data[i];
00194 }
00195 #endif
00196 #ifdef STORM_SGI_IRIX
00197 for( int i = 0; i < min( _size, int(sizeof(float)) ); i++ ) {
00198 ptdata[i] = _data[i];
00199 }
00200 #endif
00201 return data;
00202 }
00203
00204 bytepack::operator double() {
00205 double data=0;
00206 char* ptdata = (char*)(&data);
00207 #ifdef STORM_RS6000_AIX
00208 for( int i = 0; i < min( _size, int(sizeof(double)) ); i++ ) {
00209 ptdata[i] = _data[i];
00210 }
00211 #endif
00212 #ifdef STORM_x86_LINUX
00213 for( int i = 0; i < min( _size, int(sizeof(double)) ); i++ ) {
00214 ptdata[ sizeof(double) - 1 - i ] = _data[i];
00215 }
00216 #endif
00217 #ifdef STORM_SGI_IRIX
00218 for( int i = 0; i < min( _size, int(sizeof(double)) ); i++ ) {
00219 ptdata[i] = _data[i];
00220 }
00221 #endif
00222 return data;
00223 }
00224
00225 void bytepack::write( ostream& os )
00226 {
00227 for( int i = 0; i < _size; i++ ) os.put( _data[i] );
00228 }
00229
00230 void bytepack::read( istream& is )
00231 {
00232 for( int i = 0; i < _size; i++ ) is.get( _data[i] );
00233 _data[ _size ] = 0;
00234 }
00235
00236 ostream& operator << ( ostream& os, bytepack& bp )
00237 {
00238 bp.write( os );
00239 return os;
00240 }
00241
00242 istream& operator >> ( istream& is, bytepack& bp ) {
00243 bp.read( is );
00244 return is;
00245 }
00246