34
34
#include " Common/XferDeepCRC.h"
35
35
#include " Common/crc.h"
36
36
#include " Common/Snapshot.h"
37
- #include " winsock2 .h" // for htonl
37
+ #include " utility/endian_compat .h"
38
38
39
39
// -------------------------------------------------------------------------------------------------
40
40
// -------------------------------------------------------------------------------------------------
@@ -97,22 +97,8 @@ void XferCRC::endBlock( void )
97
97
// -------------------------------------------------------------------------------------------------
98
98
void XferCRC::addCRC ( UnsignedInt val )
99
99
{
100
- int hibit;
101
100
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 );
116
102
117
103
} // end addCRC
118
104
@@ -139,30 +125,33 @@ void XferCRC::xferSnapshot( Snapshot *snapshot )
139
125
// -------------------------------------------------------------------------------------------------
140
126
void XferCRC::xferImplementation ( void *data, Int dataSize )
141
127
{
142
-
143
- if (!data || dataSize < 1 )
144
- {
145
- return ;
146
- }
147
-
148
128
const UnsignedInt *uintPtr = (const UnsignedInt *) (data);
129
+ dataSize *= (data != NULL );
130
+
131
+ int dataBytes = (dataSize / 4 );
149
132
150
- for (Int i=0 ; i<dataSize/ 4 ; i++ )
133
+ for (Int i=0 ; i<dataBytes; ++i )
151
134
{
152
135
addCRC (*uintPtr++);
153
136
}
154
137
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 )
157
142
{
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 ;
166
155
}
167
156
168
157
} // end xferImplementation
@@ -179,7 +168,7 @@ void XferCRC::skip( Int dataSize )
179
168
UnsignedInt XferCRC::getCRC ( void )
180
169
{
181
170
182
- return htonl (m_crc);
171
+ return htobe (m_crc);
183
172
184
173
} // end skip
185
174
0 commit comments