LinuxQuestions.org
Review your favorite Linux distribution.
Go Back   LinuxQuestions.org > Forums > Non-*NIX Forums > Programming
User Name
Password
Programming This forum is for all programming questions.
The question does not have to be directly related to Linux and any language is fair game.

Notices

Reply
 
LinkBack Search this Thread
Old 04-12-2004, 09:48 PM   #1
AquamaN
Member
 
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146

Rep: Reputation: 15
Question CRC 16 program


Ok everyone, I am trying to write a program do this:

-a C++ crcClass to implement the CRC-16 hardware bit shift mechanism.
-I want it to include appropriate member functions to compute crc, verify crc.
-Implement a driver that calls the above with a payload data (X bits where X need not be a multiple of 8) as would be done at transmit side, or payload and CRC (as would be done at receiver).
-The command line parameters include {tx or rx}, payloadFileName, crc value {if receive}

If anyone can help me, I would be grateful. Thanks a lot!

-AquamaN
 
Old 04-12-2004, 10:48 PM   #2
Mohsen
Member
 
Registered: Feb 2003
Location: Iran
Distribution: Solaris 10
Posts: 201

Rep: Reputation: 30
I've read about the algorithm but do not implement one yet. Also I used a crc32 in NibelZoo packets. You can find that here.
 
Old 04-12-2004, 11:46 PM   #3
AquamaN
Member
 
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146

Original Poster
Rep: Reputation: 15
Ok, thanks for your input. It helped. Now I am stuck on taking in a CRC value (like for example, 8EE9) from the command line, but I can not seem to do it. It's going to be argv[3] but I can not take it into the proper variable... Here is my code.

Code:
#include <iostream.h>
#include <stdlib.h>
#include <fstream.h>

typedef unsigned char Uchar;
typedef unsigned int Uint;


Uint crc_tbl0[] =
{
	0x0000, 0xC0C1, 0xC181, 0x0140, 0xC301, 0x03C0, 0x0280, 0xC241,
	0xC601, 0x06C0, 0x0780, 0xC741, 0x0500, 0xC5C1, 0xC481, 0x0440,
	0xCC01, 0x0CC0, 0x0D80, 0xCD41, 0x0F00, 0xCFC1, 0xCE81, 0x0E40,
	0x0A00, 0xCAC1, 0xCB81, 0x0B40, 0xC901, 0x09C0, 0x0880, 0xC841,
	0xD801, 0x18C0, 0x1980, 0xD941, 0x1B00, 0xDBC1, 0xDA81, 0x1A40,
	0x1E00, 0xDEC1, 0xDF81, 0x1F40, 0xDD01, 0x1DC0, 0x1C80, 0xDC41,
	0x1400, 0xD4C1, 0xD581, 0x1540, 0xD701, 0x17C0, 0x1680, 0xD641,
	0xD201, 0x12C0, 0x1380, 0xD341, 0x1100, 0xD1C1, 0xD081, 0x1040,
	0xF001, 0x30C0, 0x3180, 0xF141, 0x3300, 0xF3C1, 0xF281, 0x3240,
	0x3600, 0xF6C1, 0xF781, 0x3740, 0xF501, 0x35C0, 0x3480, 0xF441,
	0x3C00, 0xFCC1, 0xFD81, 0x3D40, 0xFF01, 0x3FC0, 0x3E80, 0xFE41,
	0xFA01, 0x3AC0, 0x3B80, 0xFB41, 0x3900, 0xF9C1, 0xF881, 0x3840,
	0x2800, 0xE8C1, 0xE981, 0x2940, 0xEB01, 0x2BC0, 0x2A80, 0xEA41,
	0xEE01, 0x2EC0, 0x2F80, 0xEF41, 0x2D00, 0xEDC1, 0xEC81, 0x2C40,
	0xE401, 0x24C0, 0x2580, 0xE541, 0x2700, 0xE7C1, 0xE681, 0x2640,
	0x2200, 0xE2C1, 0xE381, 0x2340, 0xE101, 0x21C0, 0x2080, 0xE041,
	0xA001, 0x60C0, 0x6180, 0xA141, 0x6300, 0xA3C1, 0xA281, 0x6240,
	0x6600, 0xA6C1, 0xA781, 0x6740, 0xA501, 0x65C0, 0x6480, 0xA441,
	0x6C00, 0xACC1, 0xAD81, 0x6D40, 0xAF01, 0x6FC0, 0x6E80, 0xAE41,
	0xAA01, 0x6AC0, 0x6B80, 0xAB41, 0x6900, 0xA9C1, 0xA881, 0x6840,
	0x7800, 0xB8C1, 0xB981, 0x7940, 0xBB01, 0x7BC0, 0x7A80, 0xBA41,
	0xBE01, 0x7EC0, 0x7F80, 0xBF41, 0x7D00, 0xBDC1, 0xBC81, 0x7C40,
	0xB401, 0x74C0, 0x7580, 0xB541, 0x7700, 0xB7C1, 0xB681, 0x7640,
	0x7200, 0xB2C1, 0xB381, 0x7340, 0xB101, 0x71C0, 0x7080, 0xB041,
	0x5000, 0x90C1, 0x9181, 0x5140, 0x9301, 0x53C0, 0x5280, 0x9241,
	0x9601, 0x56C0, 0x5780, 0x9741, 0x5500, 0x95C1, 0x9481, 0x5440,
	0x9C01, 0x5CC0, 0x5D80, 0x9D41, 0x5F00, 0x9FC1, 0x9E81, 0x5E40,
	0x5A00, 0x9AC1, 0x9B81, 0x5B40, 0x9901, 0x59C0, 0x5880, 0x9841,
	0x8801, 0x48C0, 0x4980, 0x8941, 0x4B00, 0x8BC1, 0x8A81, 0x4A40,
	0x4E00, 0x8EC1, 0x8F81, 0x4F40, 0x8D01, 0x4DC0, 0x4C80, 0x8C41,
	0x4400, 0x84C1, 0x8581, 0x4540, 0x8701, 0x47C0, 0x4680, 0x8641,
	0x8201, 0x42C0, 0x4380, 0x8341, 0x4100, 0x81C1, 0x8081, 0x4040,
};

	/* Here's the lookup table for the nibble-at-a-time routine.
		Note that it's every 16th entry from the first table. The
		accompanying "crc_v3.txt" does a good job of explaining
		why this works. */

Uint crc_tbl1[] =
{

	0x0000, 0xCC01,	0xD801,	0x1400,	0xF001,	0x3C00,	0x2800,	0xE401,
	0xA001,	0x6C00,	0x7800,	0xB401,	0x5000,	0x9C01,	0x8801,	0x4400,
};

	/* Test case: generate the CRC of the specified file, using both the
		byte-at-a-time and nibble-at-a-time techniques. */

int main(int argc, char **argv)
{
	int ch;
	Uint acc0 = 0xFFFF, acc1 = 0xFFFF; //crcIn = 0xFFFF;
	Uchar crcIn;
	FILE *fp;
	bool Tx, Rx;

	if(argc > 1)
	{
		if(argv[1] == "Tx")
		{
			Tx = true;
			Rx = false;
		}
		else
		{
			Rx = true;
			Tx = false;
		}
		
		if((fp = fopen(argv[2], "rb")) == NULL)
		{
			cout << "Error opening file" << endl;
			exit(1);
		}
		
		crcIn = argv[3];  // <--- Take in right here!!!!

		while((ch = getc(fp)) != EOF)
		{
			acc0 = crc_tbl0[(Uchar) ch ^ (Uchar) acc0] ^ (Uchar) (acc0 >> 8);
			acc1 = crc_tbl1[(ch ^ acc1) & 15] ^ (acc1 >> 4);
			acc1 = crc_tbl1[((ch >> 4) ^ acc1) & 15] ^ (acc1 >> 4);
		}

		cout << "CRC checksum is: " << acc0 << "." << endl;
		
		if (Rx == true)
		{
			cout << "Currently in receiving mode..." << endl;
			cout << "Checking CRC for equality..." << endl;
			
		}
			
	}
	return 0;
}
I just need to take it in then compare it to acc0 further down the road for a CRC check... So, I obviously need to be able to compare two variables of the same type... (unless a cast operator is used). Thanks!

-AquamaN
 
Old 04-13-2004, 09:56 AM   #4
AquamaN
Member
 
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146

Original Poster
Rep: Reputation: 15
bump
 
Old 04-13-2004, 11:47 AM   #5
Mohsen
Member
 
Registered: Feb 2003
Location: Iran
Distribution: Solaris 10
Posts: 201

Rep: Reputation: 30
Quote:
Now I am stuck on taking in a CRC value (like for example, 8EE9) from the command line, ...
You are trying to get some hex values in. Is it the problem? If yes, just use
Code:
long int strtol(const char *sptr, char **endptr, int base);
with approproate base (16) and NULL as the second argument.
 
Old 04-13-2004, 03:28 PM   #6
AquamaN
Member
 
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146

Original Poster
Rep: Reputation: 15
You, sir, are AWESOME!! I can't believe I didn't think of that. Then again, that's why we have forums like this. Thanks a lot!!


-AquamaN
 
  


Reply


Thread Tools Search this Thread
Search this Thread:

Advanced Search

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
How, what, and/or why is a crc error ?? TheHushedCaskeT Linux - Software 1 02-02-2005 07:01 PM
CRC error sanjibgupta Linux - Networking 0 07-01-2004 01:22 AM
crc Straterra Slackware - Installation 2 03-05-2004 04:06 PM
crc error FNC Linux - General 1 01-30-2002 01:04 AM
crc error johncla General 5 08-24-2001 10:21 AM


All times are GMT -5. The time now is 08:47 AM.

Main Menu
 
My LQ
Write for LQ
LinuxQuestions.org is looking for people interested in writing Editorials, Articles, Reviews, and more. If you'd like to contribute content, let us know.
Main Menu
Syndicate
RSS1  Latest Threads
RSS1  LQ News
Twitter: @linuxquestions
identi.ca: @linuxquestions
Facebook: @linuxquestions
Open Source Consulting | Domain Registration