#include <stdio.h>
#include <string.h>
unsigned char arrayCx[20] = {1,0,0,1,1,0,1,1}; // 二维码1数据
unsigned char arrayGx[20] = {0,1,1,1,0,0,0,1}; // 二维码2数据
unsigned char gLen = 8; // 二维码1数组长度
void lfsrArithmetic(unsigned int cx,unsigned int gx);
void arrayPro(unsigned char arrcx[],unsigned char arrgx[],char arrayLen);
void main()
{
//lfsrArithmetic(0XD9,0X8E); //
arrayPro(arrayCx,arrayGx,gLen);
}
/*
void lfsrArithmetic(unsigned int cx,unsigned int gx)
输入参数:
unsigned char arrcx[] 二维码1数据
unsigned char arrgx[] 二维码2数据
char arrayLen 二维码1数组长度
*/
void arrayPro(unsigned char arrcx[],unsigned char arrgx[],char arrayLen)
{
unsigned int cx = 0;
unsigned int gx = 0;
unsigned char i = 0;
printf("二维码1数据: ");
for(i=0;i<arrayLen;i++)
{
printf("%d ",arrcx[i]);
}
printf("\n二维码2数据: ");
for(i=0;i<arrayLen;i++)
{
printf("%d ",arrgx[i]);
}
printf("\n二维码1数组长度: ");
printf("%d\n",arrayLen);
for(i=0;i<arrayLen;i++)
{
cx = cx<<1;
cx = cx|(unsigned char)arrcx[arrayLen-1-i];
gx = gx<<1;
gx = gx|(unsigned char)arrgx[arrayLen-1-i];
}
//printf("%X %X \n",cx,gx);
lfsrArithmetic(cx,gx);
}
/*
void lfsrArithmetic(unsigned int cx,unsigned int gx)
输入参数:
unsigned int cx 表示原始数据
unsigned int gx 表示原多项式,抽头
如:
A{1,1,1,1} CX = 0X0F
B{1,0,0,1} GX = 0X09
开启码:0xF5、0x91、0xEB、0x23、0xD6、0x47
如:
A{1,1,0,1,1,0,1,1} 高位在后 低位在前 CX = 0XDB
B{0,1,1,1,0,0,0,1} 高位在后 低位在前 GX = 0X8E
开启码:0xDB、0xFA、0x8D、0x81、0xF2、0xD0
如:
A{1,0,0,1,1,0,1,1} 高位在后 低位在前 CX = 0XD9
B{0,1,1,1,0,0,0,1} 高位在后 低位在前 GX = 0X8E
开启码:0x9B、0x03、0xE5、0xA0、0x85、0xDC
*/
void lfsrArithmetic(unsigned int cx,unsigned int gx)
{
int lin[20] = {0};
int i = 0,j = 0,k = 0;
int orRes = 0;
unsigned int dec = 0X00000001;
int cnt = 0;
unsigned int Cx = 0; // 寄存器的值
unsigned int Qn[10000] = {0}; // 输出结果
unsigned char password[6] = {0};
unsigned char res = 0;
int index = 0;
unsigned int temp = 0;
unsigned int tempCx = 0;
Cx = cx; // 寄存器赋初值,寄存器高位为Cx的最低位
tempCx = cx;
temp = Cx;
// 斐波那契(外部LFSR) (g3, g2, g1, g0) = (1, 0, 0, 1) 表示抽头
//printf("%d%d%d%d\n",(Cx&0X08)>>3,(Cx&0X04)>>2,(Cx&0X02)>1,Cx&0X01);
while(1)
{
Qn[index] = Cx&0X00000001;
index++;
dec = 0X00000001;
tempCx = cx;
cnt = 0;
memset(lin,0,sizeof(lin));
while(0 != tempCx)
{
if((gx&dec) == dec)
{
lin[cnt] = (Cx&dec)>>cnt;
}
dec = dec<<1;
tempCx = tempCx>>1;
cnt++;
}
Cx = Cx>>1;
orRes = lin[0];
for(i=1;i<cnt;i++)
{
orRes = orRes^lin[i];
}
Cx = (orRes<<(cnt-1))|Cx;
if(temp == Cx)
{
break;
}
if(index>255)
{
break;
}
}
for(i=0;i<20;i++)
{
for(j = 0;j < index;j++)
{
Qn[i*(index)+j] = Qn[j];
}
}
for(i=0;i<6;i++)
{
for(j=0;j<8;j++)
{
res = res<<1;
res = res|(unsigned char)Qn[j+k];
}
k = k+8;
password[i] = res;
res = 0;
}
printf("开启码:");
for(i = 0;i < 6;i++)
{
printf("%X ",password[i]);
}
puts("");
}
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
LFSR.7z (1个子文件)
LFSR.c 3KB
共 1 条
- 1
资源评论
- 2301_766455962024-01-01资源内容总结的很到位,内容详实,很受用,学到了~
小材大用
- 粉丝: 2762
- 资源: 44
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功