iRFID_Decode96bit( ) Input: ucBarCode,输入时,应当是开辟15字节空间的变量存储一个2-8Byte的无符号字符串
Output: 输出时,ucBarCode是一个1-14Byte(字符数)的字符
返回值等于BarCode长度, -1代表原始BarCode与解码后BarCode长度不一致
说明:用于解压缩条码,将压缩为2-8Byte的条码解压缩为压缩前的1-14Byte条码
iRFID_Decode96bit(unsigned char *ucBarCode )
{
int i, iDatLen, iBarCodeLen;
unsigned char ucTmpChar;
unsigned char ucTmpStr[9];
unsigned char ucWorkStr[15] = "00000000000000"; //字符串长度实际为14位字符+结束符'\0'
union
{
unsigned char ucStr[4];
unsigned int uiDat;
} unWorkDat;
iBarCodeLen = (unsigned int)( ucBarCode[0]& 0x0F ); // 获取压缩前BarCode编码长度
if( iBarCodeLen < 1 || iBarCodeLen >14 ) return ( -1 );
if( iBarCodeLen < 8 ) // 处理1-7字符长度的BarCode
{
for( i=0; i<iBarCodeLen; ++i )
{
ucBarCode[i] = ucBarCode[i+1];
}
ucBarCode[iBarCodeLen] = 0;
return ( iBarCodeLen );
}
for( i=0; i<4; ++i ) // 将压缩码的前面(低)4字节取出
{
unWorkDat.ucStr[i] = ucBarCode[i];
}
unWorkDat.uiDat >>= 4;
ucWorkStr[iBarCodeLen - 1] = (unsignedchar)( unWorkDat.uiDat & 0xFF ); // 还原最后1位字符,即校验位
unWorkDat.uiDat >>= 8;
for( i=2; i>=0; --i ) // 解码最前面3位字母或数字
{
ucWorkStr[i] = (unsigned char)( (unWorkDat.uiDat & 0x3F ) + 0x30 );
unWorkDat.uiDat >>= 6;
}
ucWorkStr[3] = (unsigned char)(unWorkDat.uiDat & 0x03 ); // 还原第四位数字的低2bit
for( i=0; i<4; ++i ) // 将压缩码的前面(高)4字节取出
{
unWorkDat.ucStr[i] = ucBarCode[i+4];
}
ucWorkStr[3] = ( ucWorkStr[3] | ( (unsignedchar)( unWorkDat.uiDat & 0x03 ) << 2 ) ) + 0x30; // 取出第4位数字的低2bit,还原第4位数字
unWorkDat.uiDat >>= 2;
itoa( unWorkDat.uiDat, (char *)ucTmpStr, 10); // 还原BarCode从第5位起除最后1位的2-9位数字
iDatLen = strlen( (char *)ucTmpStr );
for( i=0; i<iDatLen; ++i )
{
ucWorkStr[i + iBarCodeLen - iDatLen -1] = ucTmpStr[i];
}
for( i=0; i<iBarCodeLen; ++i ) // 将解码后的BarCode通过参数返回
{
ucBarCode[i] = ucWorkStr[i];
}
ucBarCode[iBarCodeLen] = 0;
return ( iBarCodeLen );
}