The following function maybe used to calculate the CRC of a given polynomial
* @param ydividend D(x) the binary representation of the polynomial whose CRC is to be calculated
* @param xdivisor the polynomial that base P(x)
* X^4 + X^2+x+1 will be represented as 10111
* Note :The Dividend shouldn't be padded to include the divisor length
* Algorithm in partial 'C'
*
* input String dividend, String Divisor
* Dividend left shift dividend by length of divisor - 1;
* pos = dividend.length
* while (pos > lengthof(divisor))
* {
* temp <- divdident[pos,lengthof(divisor)]
* temp <-xor temp with divisor
* temp <- lshift(temp,1)
* temp[lengthof(divisor -1)] = dividend[pos - lengthof( pos)-1]
* pos <-pos - 1
*
* }
The solution uses java bit String
//testvectors
String xdivisor= "110101";
String ydividend = "1010001101";
remainder will be 001110
* @param ydividend D(x) the binary representation of the polynomial whose CRC is to be calculated
* @param xdivisor the polynomial that base P(x)
* X^4 + X^2+x+1 will be represented as 10111
* Note :The Dividend shouldn't be padded to include the divisor length
* Algorithm in partial 'C'
*
* input String dividend, String Divisor
* Dividend left shift dividend by length of divisor - 1;
* pos = dividend.length
* while (pos > lengthof(divisor))
* {
* temp <- divdident[pos,lengthof(divisor)]
* temp <-xor temp with divisor
* temp <- lshift(temp,1)
* temp[lengthof(divisor -1)] = dividend[pos - lengthof( pos)-1]
* pos <-pos - 1
*
* }
The solution uses java bit String
//testvectors
String xdivisor= "110101";
String ydividend = "1010001101";
remainder will be 001110
public static String calculateCrc(String ydividend, String xdivisor) throws NumberFormatException
{
//testvectors
// String xdivisor= "110101";
// String ydividend = "1010001101";
// remainder will be 001110
BitSet divisor = new BitSet(xdivisor.length());
BitSet dividend = new BitSet(ydividend.length());
for(int m = 0;m<ydividend.length();m++)
{
if(ydividend.charAt(m) == '1')
{
dividend.set(ydividend.length()-m-1);
}
else if(ydividend.charAt(m)=='0')
{
dividend.clear(ydividend.length()-m-1);
}
else
{
throw new NumberFormatException("Invalid Bit String");
}
}
for(int k=0;k<xdivisor.length();k++)
{
if(xdivisor.charAt(k) == '1')
{
divisor.set(xdivisor.length()-k-1);
}
else if(xdivisor.charAt(k)=='0')
{
divisor.clear(xdivisor.length()-k-1);
}
else
{
throw new NumberFormatException("Invalid Bit String");
}
}
BitSet temp = new BitSet();
int divisorlength = xdivisor.length();
int dividendlength = ydividend.length();
int dividendwid0len = divisorlength + dividendlength -1;
BitSet LeftShiftedDividend = new BitSet(dividendwid0len);
for(int g=0;g<dividend.length();g++)
{
if(dividend.get(g) == true)
{
LeftShiftedDividend.set(g);
}
}
LeftShiftedDividend =leftshift(LeftShiftedDividend,divisorlength-1);
temp = LeftShiftedDividend.get(LeftShiftedDividend.length()-divisorlength,LeftShiftedDividend.length());
BitSet tempDivisor = divisor.get(0,divisor.length());
for(int z=0;z<dividendwid0len-divisorlength;z++)
{
temp.xor(tempDivisor);
temp = leftshift(temp,1);
temp.set(0,LeftShiftedDividend.get(dividendwid0len-divisorlength-z-1));
if(temp.length()>0){
if(temp.get(divisor.length()-1)==false)
{
tempDivisor = new BitSet(temp.length());
}
else
{
tempDivisor = divisor;
}}
else {
tempDivisor = new BitSet(temp.length());
}
}
if(temp.length()>0){
if(temp.get(divisor.length()-1)==true)
{
temp.xor(divisor);
}
}
String theOutputCRC="";
for(int r=0;r<divisorlength;r++)
{
if(temp.get(r)==false)
{
theOutputCRC="0"+theOutputCRC;
}
else
{
theOutputCRC="1"+theOutputCRC;
}
}
return (theOutputCRC);
}