3434#include " Common/XferDeepCRC.h"
3535#include " Common/crc.h"
3636#include " Common/Snapshot.h"
37- #include " winsock2 .h" // for htonl
37+ #include " utility/endian_compat .h"
3838
3939// -------------------------------------------------------------------------------------------------
4040// -------------------------------------------------------------------------------------------------
@@ -97,22 +97,8 @@ void XferCRC::endBlock( void )
9797// -------------------------------------------------------------------------------------------------
9898void XferCRC::addCRC ( UnsignedInt val )
9999{
100- int hibit;
101100
102- val = htonl (val);
103-
104- if (m_crc & 0x80000000 )
105- {
106- hibit = 1 ;
107- }
108- else
109- {
110- hibit = 0 ;
111- }
112-
113- m_crc <<= 1 ;
114- m_crc += val;
115- m_crc += hibit;
101+ m_crc = (m_crc << 1 ) + htobe (val) + ((m_crc >> 31 ) & 0x01 );
116102
117103} // end addCRC
118104
@@ -139,30 +125,33 @@ void XferCRC::xferSnapshot( Snapshot *snapshot )
139125// -------------------------------------------------------------------------------------------------
140126void XferCRC::xferImplementation ( void *data, Int dataSize )
141127{
142-
143- if (!data || dataSize < 1 )
144- {
145- return ;
146- }
147-
148128 const UnsignedInt *uintPtr = (const UnsignedInt *) (data);
129+ dataSize *= (data != NULL );
130+
131+ int dataBytes = (dataSize / 4 );
149132
150- for (Int i=0 ; i<dataSize/ 4 ; i++ )
133+ for (Int i=0 ; i<dataBytes; ++i )
151134 {
152135 addCRC (*uintPtr++);
153136 }
154137
155- int leftover = dataSize & 3 ;
156- if (leftover)
138+ UnsignedInt val = 0 ;
139+ const unsigned char *c = (const unsigned char *)uintPtr;
140+
141+ switch (dataSize & 3 )
157142 {
158- UnsignedInt val = 0 ;
159- const unsigned char *c = (const unsigned char *)uintPtr;
160- for (Int i=0 ; i<leftover; i++)
161- {
162- val += (c[i] << (i*8 ));
163- }
164- val = htonl (val);
165- addCRC (val);
143+ case 3 :
144+ val += (c[2 ] << 16 );
145+ FALLTHROUGH;
146+ case 2 :
147+ val += (c[1 ] << 8 );
148+ FALLTHROUGH;
149+ case 1 :
150+ val += c[0 ];
151+ m_crc = (m_crc << 1 ) + val + ((m_crc >> 31 ) & 0x01 );
152+ FALLTHROUGH;
153+ default :
154+ break ;
166155 }
167156
168157} // end xferImplementation
@@ -179,7 +168,7 @@ void XferCRC::skip( Int dataSize )
179168UnsignedInt XferCRC::getCRC ( void )
180169{
181170
182- return htonl (m_crc);
171+ return htobe (m_crc);
183172
184173} // end skip
185174
0 commit comments