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
Welcome to
LinuxQuestions.org , a friendly and active Linux Community.
You are currently viewing LQ as a guest. By joining our community you will have the ability to post topics, receive our newsletter, use the advanced search, subscribe to threads and access many other special features. Registration is quick, simple and absolutely free.
Join our community today!
Note that registered members see fewer ads, and ContentLink is completely disabled once you log in.
Are you new to LinuxQuestions.org? Visit the following links:
Site Howto |
Site FAQ |
Sitemap |
Register Now
If you have any problems with the registration process or your account login, please
contact us . If you need to reset your password,
click here .
Having a problem logging in? Please visit this page to clear all LQ-related cookies.
04-12-2004, 09:48 PM
#1
Member
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146
Rep:
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
04-12-2004, 10:48 PM
#2
Member
Registered: Feb 2003
Location: Iran
Distribution: Solaris 10
Posts: 201
Rep:
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 .
04-12-2004, 11:46 PM
#3
Member
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146
Original Poster
Rep:
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
04-13-2004, 09:56 AM
#4
Member
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146
Original Poster
Rep:
bump
04-13-2004, 11:47 AM
#5
Member
Registered: Feb 2003
Location: Iran
Distribution: Solaris 10
Posts: 201
Rep:
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.
04-13-2004, 03:28 PM
#6
Member
Registered: Oct 2002
Location: Ohio, USA
Distribution: OS X 10.4.8, Ubuntu 6.10
Posts: 146
Original Poster
Rep:
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
Thread Tools
Search this Thread
Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts
HTML code is 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 .
LinuxQuestions.org is looking for people interested in writing
Editorials, Articles, Reviews, and more. If you'd like to contribute
content, let us know .
Latest Threads
LQ News