private void CompressFinal(ulong length) {
uint lswlen = (uint)(length & 0xFFFFFFFF);
uint mswlen = (uint)(length >> 32);
// clear _X
Array.Clear(_X, 0, _X.Length);
// put bytes from _ProcessingBuffer into _X
int ptr = 0;
for (uint i = 0; i < (lswlen & 63); i++) {
// byte i goes into word X[i div 4] at pos. 8*(i mod 4)
_X[i >> 2] ^= ((uint)_ProcessingBuffer[ptr++]) << (int)(8 * (i & 3));
}
// append the bit m_n == 1
_X[(lswlen >> 2) & 15] ^= (uint)1 << (int)(8 * (lswlen & 3) + 7);
if ((lswlen & 63) > 55) {
// length goes to next block
Compress();
Array.Clear(_X, 0, _X.Length);
}
// append length in bits
_X[14] = lswlen << 3;
_X[15] = (lswlen >> 29) | (mswlen << 3);
Compress();
}