C++ 执行个函数,求帮助

wangzhe1991919 2018-08-26 04:42:28
1.不懂C ,C++,求帮助
2.现有一段C++ 代码, 已知输入参数, 求结果
3.输入参数 16进制码, "30 31 30 31 32 39"
4.C++函数代码(CRC16校验)

unsigned int gen_crc(BYTE far *frame, short frame_len)
{
BYTE c, treat, bcrc;
unsigned int wcrc = 0;
short i, j;

for (i = 0; i < frame_len; i++)
{
c = frame[i];
for (j = 0; j < 8; j++)
{
treat = c & 0x80;
c <<= 1;
bcrc = (wcrc >> 8) & 0x80;
wcrc <<= 1;
if (treat != bcrc)
wcrc ^= 0x1021;
}
}
return wcrc;
}

5.求个返回结果。
6.这种计算方式是对应的哪种类型?
...全文
130 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangzhe1991919 2018-08-27
  • 打赏
  • 举报
回复
那就是对应了这种算法,
丁劲犇 2018-08-26
  • 打赏
  • 举报
回复


#include <vector>
#include <stdio.h>
unsigned int gen_crc(const unsigned char *frame, short frame_len)
{
unsigned char c, treat, bcrc;
unsigned int wcrc = 0;
short i, j;

for (i = 0; i < frame_len; i++)
{
c = frame[i];
for (j = 0; j < 8; j++)
{
treat = c & 0x80;
c <<= 1;
bcrc = (wcrc >> 8) & 0x80;
wcrc <<= 1;
if (treat != bcrc)
wcrc ^= 0x1021;
}
}
return wcrc;
}

unsigned int gen_crcbit(const unsigned char *frame, short frame_len)
{
std::vector<unsigned char> vec_bits;
for (int i=0;i<frame_len*8;++i)
vec_bits.push_back((frame[i/8]>>(7-i%8))&0x01);
for (int i=0;i<16;++i)
vec_bits.push_back(0);
const unsigned char poly[17] = {1,0,0,0,1,0,0,0,0,0,0,1,0,0,0,0,1};
for (int j=0;j<vec_bits.size();++j)
if (vec_bits[j])
putchar('1');
else
putchar('0');

for (int i=0;i<frame_len*8;++i)
{
if (vec_bits[i])
{
for (int j=0;j<17;++j)
vec_bits[i+j] = vec_bits[i+j]==poly[j]?0:1;
}
else
continue;

printf("\n");
for (int j=0;j<i;++j)
putchar(' ');
for (int j=0;j<17;++j)
putchar(poly[j]==0?'0':'1');

printf("\n");


bool bhit1 = false;

for (int j=0;j<frame_len*8+16;++j)
if (vec_bits[j])
{
putchar('1');
bhit1 = true;
}
else if (bhit1)
putchar('0');
else
putchar(' ');

}
int cc = 0;
for (int j=0;j<16;++j)
{
cc<<=1;
cc += vec_bits[frame_len*8+j];
}

return cc;
}

int main(int argc, char *argv[])
{
const unsigned char pp[] = {0x30,0x31,0x30,0x31,0x32,0x39};

unsigned int crc1 = gen_crcbit(pp,6);

printf ("\n%04x\n",crc1);

crc1 = gen_crc(pp,6);

printf ("\n%04x\n",crc1 & 0x0ffff);
return 0;
}



输出:


0011000000110001001100000011000100110010001110010000000000000000
10001000000100001
1001000110101000100000011000100110010001110010000000000000000
10001000000100001
1100110111000000000011000100110010001110010000000000000000
10001000000100001
100010111010000100011000100110010001110010000000000000000
10001000000100001
111011000110011000100110010001110010000000000000000
10001000000100001
11001000111011010100110010001110010000000000000000
10001000000100001
1000000111111011100110010001110010000000000000000
10001000000100001
100111101011000110010001110010000000000000000
10001000000100001
101101010000100010001110010000000000000000
10001000000100001
1111010001100000001110010000000000000000
10001000000100001
111110001110000101110010000000000000000
10001000000100001
11100001111000111110010000000000000000
10001000000100001
1101001111100110110010000000000000000
10001000000100001
101101111110110010010000000000000000
10001000000100001
1111111111110000010000000000000000
10001000000100001
111011111100000110000000000000000
10001000000100001
11001111101000100000000000000000
10001000000100001
1000111101100101000000000000000
10001000000100001
11101110101100000000000000
10001000000100001
1100110101000001000000000
10001000000100001
100010101010001100000000
10001000000100001
101011001110000000
10001000000100001
1001001111000010
93c2

93c2

丁劲犇 2018-08-26
  • 打赏
  • 举报
回复
0x1021= 0001 0000 0010 0001, 即 x^12+x^5+1, 程序已经判断了最高位,因此,为 x^16 + x^12+x^5+1

这个程序其实就是做了二进制余二除法。

具体的意义,建议单步跟踪来看。

3,881

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 其它技术问题
社区管理员
  • 其它技术问题社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧