#include #include #include #include #include #include "utils.h" ulong swapByte(ulong d, int n) { register uchar *p = (uchar *) &d; register uchar temp[4]; if ( n < 1 ) return d; // no swap int i; for ( i = 0; i < xmin(n, 4); i++ ) temp[i] = p[n-i-1]; if ( n < 4 ) for ( i = n; i < 4; i++ ) temp[i] = 0; return *((ulong *) temp); } long swapByte(long d, int n) { register uchar *p = (uchar *) &d; register uchar temp[4]; if ( n < 1 ) return d; // no swap int i; for ( i = 0; i < xmin(n, 4); i++ ) temp[i] = p[n-i-1]; if ( n < 4 ) for ( i = n; i < 4; i++ ) temp[i] = 0; return *((long *) temp); } ulong swapByte(ulong d) { register uchar *p = (uchar *) &d; register uchar temp[4]; int i; for ( i = 0; i < 4; i++ ) temp[i] = p[3-i]; return *((ulong *) temp); } long swapByte(long d) { register uchar *p = (uchar *) &d; register uchar temp[4]; int i; for ( i = 0; i < 4; i++ ) temp[i] = p[3-i]; return *((long *) temp); } ushort swapByte(ushort d) { register uchar *p = (uchar *) &d; register uchar temp[2]; temp[0] = p[1]; temp[1] = p[0]; return *((ushort *) temp); } int swapByte(int d) { register uchar *p = (uchar *) &d; register uchar temp[2]; temp[0] = p[1]; temp[1] = p[0]; return *((int *) temp); } uchar swapBits(uchar d) { asm { mov cx,8 mov bl,d mov al,0 clc } L100: asm { rcl bl,1 rcr al,1 loop L100 } return (_AL); } char swapBits(char d) { asm { mov cx,8 mov bl,d mov al,0 clc } L100: asm { rcl bl,1 rcr al,1 loop L100 } return (_AL); } void swapBits(uchar *d, int len) { int i; for ( i = 0; i < len; i++ ) d[i] = swapBits(d[i]); } void swapBits(char *d, int len) { int i; for ( i = 0; i < len; i++ ) d[i] = swapBits(d[i]); } int bitCount(ulong data) { int count = 0; ulong temp = data; for ( int i = 0; i < 32; i++ ) { if ( temp & 1L ) count++; temp >>= 1; } return count; } int bitCount(long data) { int count = 0; long temp = data; for ( int i = 0; i < 32; i++ ) { if ( temp & 1L ) count++; temp >>= 1; } return count; } int bitCount(ushort data) { int count = 0; ushort temp = data; for ( int i = 0; i < 16; i++ ) { if ( temp & 1 ) count++; temp >>= 1; } return count; } int bitCount(int data) { int count = 0; int temp = data; for ( int i = 0; i < 16; i++ ) { if ( temp & 1 ) count++; temp >>= 1; } return count; } int bitCount(uchar data) { int count = 0; uchar temp = data; for ( int i = 0; i < 8; i++ ) { if ( temp & 1 ) count++; temp >>= 1; } return count; } int bitCount(char data) { int count = 0; char temp = data; for ( int i = 0; i < 8; i++ ) { if ( temp & 1 ) count++; temp >>= 1; } return count; } DumpData::DumpData(int mode) { newFile = mode; char *fileName = new char[15]; fileNo = getFileNo(); if ( newFile ) fileNo++; if ( fileNo == -1 ) fileNo = 0; sprintf(fileName, "dump%04d.dat", fileNo); if ( newFile ) fp = fopen(fileName, "wb"); else fp = fopen(fileName, "ab+"); if ( fp == NULL ) openError = TRUE; else openError = FALSE; delete fileName; } DumpData::~DumpData() { fclose(fp); } int DumpData::dump(uchar *data, ushort nbytes) { if ( openError ) return TRUE; fwrite((void *) data, 1, nbytes, fp); return FALSE; } int DumpData::getFileNo() { struct find_t ffblk; int done; int last_number = -1; int num; char *str = new char[10]; done = _dos_findfirst("dump*.dat", _A_NORMAL, &ffblk); while ( !done ) { strncpy(str, ffblk.name, 8); str[8] = '\0'; sscanf(&str[4], "%d", &num); last_number = xmax(last_number, num); done = _dos_findnext(&ffblk); } delete str; return last_number; } int DumpData::currentFile() { return fileNo; } ulong crcTable[256]; ulong crc32(uchar *d, int len) { register ulong crc; int nbytes = len; uchar *p = d; crc = 0xffffffffL; while ( nbytes-- ) { crc = (crc << 8) ^ crcTable[(crc >> 24) ^ *p++]; } return (crc ^ 0xffffffffL); } void crcTableInit() { ulong crc, poly; int i, j; poly = 0x04c11db7L; // poly = 0x82611db7L; for ( i = 0; i < 256; i++ ) { crc = (ulong) i << 24; j = 8; while ( j-- ) crc = (crc & 0x80000000L) ? ((crc << 1) ^ poly) : (crc << 1); crcTable[i] = crc; } }