想了很久也没想出来...

时间:2021-10-17 21:31:57
当我们给大洋彼岸的朋友发出一封email或给家乡的亲人发送一条手机短信时,我们一般不会 
担心对方收到错误的信息。然而,无论email还是手机短信在抵达目的地前都必需化为电信号穿越无 
数的电缆和设备,甚至化作无形的电磁波在天空中传播,衰减和噪音时刻都威胁着你发出的信息。为 
了保证通信的正确性,必需及时发现传输错误并予以纠正,这是现代通信技术中的重要研究内容。一 
般的解决思路是在原始信息的后面附加一些校验信息,通过这些校验信息来判断传输的正确性。循环 
冗余码CRC就是这样一种信息校验方法。它的思路是: 
待传输的信息是由字节序列组成的,可以看作是一个很长的正二进制数B。当传输B时,在其后 
附上两个字节的CRC校验值组成B’。CRC校验值不是任意取的,它要使B’能被一个16位的预定义 
值g整除。信息的接收方也知道g,因此对方只需把接收值除以g看余数是否为零就能判断传输的正 
确性。在本题中我们设定g=34943(十进制)。你的任务是编写程序计算任意输入信息对应的CRC校 
验值。 
输入:输入文件中每一行的内容(不包括换行符)就代表一条待传输的信息。每一条待传输信息包含 
不多于1024个ASCII字符。首字符为“#”的行代表输入的结束。 
输出:输出文件的每一行包含两个16进制数(以空格分隔)代表输入文件中对应行中待传输信息的两 
字节CRC校验值。每个校验值应该在十进制数的0到34942之间。 
示例 
输入: 
this is a test 


输出: 
77 FD 
00 00 
0C 86 

8 个解决方案

#1


刚开始时,余数ys为0;

每次从输入读取1个字符c;
计算 ys=(ys*2^8 + c) mod g

那么最终的结果为:
g- (ys*2^16 mod g)

#2


网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?

#3


网上讲CRC的资料成堆成堆的。你就不会搜一下吗? 
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
====================
-> 网上的很难看懂! 小弟刚接触这方面的东西! 

#4


自己顶一下!

#5


这哪是什么CRC,  就一大数除法问题:要求“原数据与结尾的所谓的crc连接在一起的二进制数”能被g整除;

A的ASC码为65;
“数据与结尾的所谓的crcL连接在一起的二进制数”
==65*2^16+crc

因为65*2^16+crc是g的倍数,且crc小于g;

所以 crc==g-(65*2^16 mod g)==3206

3206的16进制表示就是:0C 86




#6


这个题和标准的CRC还有那么点区别,不过思想也很简单。
开始余数为0,
然后把第一个字节取出来,左移16位,除以g,会得到一个余数y,
然后把下一个字节取出来,加上余数y的高字节,左移16位,除以g,余数的高字节加上上次余数的低字节,以结果为y
以下循环至读完
把余数除以g,得最后的余数
结果就是g-最后的余数
懒得开VC,用python写了个程序,语法几乎和c一样

>>> def crc(tar,g):
...  ys=0
...  for c in tar:
...  c=ord(c) #value of ascII
...  c+=ys>>8
...  c<<=16
...  c=c%g
...  ys=ys&0xff
...  ys<<=8
...  ys+=c
...  ys=ys%g
...  result=g-ys
...  print '%x'%result
...  return result
... 
>>> crc('this is a test',p)
77fd
30717
>>> crc('A',p)
c86
3206

#7


上面的格式没调好,再来一次吧

>>> def crc(tar,g):
...  ys=0
...  for c in tar:
...  c=ord(c) #value of ascII
...  c+=ys>>8
...  c<<=16
...  c=c%g
...  ys=ys&0xff
...  ys<<=8
...  ys+=c
...  ys=ys%g
...  result=g-ys
...  print '%x'%result
...  return result
... 
>>> crc('this is a test',p)
77fd
30717
>>> crc('A',p)
c86
3206
>>>

#8


引用 7 楼 whycadi 的回复:
上面的格式没调好,再来一次吧 

Python code
>>> def crc(tar,g):
...     ys=0
...     for c in tar:
...         c=ord(c) #value of ascII
...         c+=ys>>8
...         c<<=16
...         c=c%g
...         ys=ys&0xff
...         ys<<=8
...         ys+=c
...         ys=ys%g
...     result=g-ys
...     print '%x'%result
...     return result
... 
>>> crc('this is a test',p)
77fd


可不可以出个C版,这个实在看不懂。。

#1


刚开始时,余数ys为0;

每次从输入读取1个字符c;
计算 ys=(ys*2^8 + c) mod g

那么最终的结果为:
g- (ys*2^16 mod g)

#2


网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?

#3


网上讲CRC的资料成堆成堆的。你就不会搜一下吗? 
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
====================
-> 网上的很难看懂! 小弟刚接触这方面的东西! 

#4


自己顶一下!

#5


这哪是什么CRC,  就一大数除法问题:要求“原数据与结尾的所谓的crc连接在一起的二进制数”能被g整除;

A的ASC码为65;
“数据与结尾的所谓的crcL连接在一起的二进制数”
==65*2^16+crc

因为65*2^16+crc是g的倍数,且crc小于g;

所以 crc==g-(65*2^16 mod g)==3206

3206的16进制表示就是:0C 86




#6


这个题和标准的CRC还有那么点区别,不过思想也很简单。
开始余数为0,
然后把第一个字节取出来,左移16位,除以g,会得到一个余数y,
然后把下一个字节取出来,加上余数y的高字节,左移16位,除以g,余数的高字节加上上次余数的低字节,以结果为y
以下循环至读完
把余数除以g,得最后的余数
结果就是g-最后的余数
懒得开VC,用python写了个程序,语法几乎和c一样

>>> def crc(tar,g):
...  ys=0
...  for c in tar:
...  c=ord(c) #value of ascII
...  c+=ys>>8
...  c<<=16
...  c=c%g
...  ys=ys&0xff
...  ys<<=8
...  ys+=c
...  ys=ys%g
...  result=g-ys
...  print '%x'%result
...  return result
... 
>>> crc('this is a test',p)
77fd
30717
>>> crc('A',p)
c86
3206

#7


上面的格式没调好,再来一次吧

>>> def crc(tar,g):
...  ys=0
...  for c in tar:
...  c=ord(c) #value of ascII
...  c+=ys>>8
...  c<<=16
...  c=c%g
...  ys=ys&0xff
...  ys<<=8
...  ys+=c
...  ys=ys%g
...  result=g-ys
...  print '%x'%result
...  return result
... 
>>> crc('this is a test',p)
77fd
30717
>>> crc('A',p)
c86
3206
>>>

#8


引用 7 楼 whycadi 的回复:
上面的格式没调好,再来一次吧 

Python code
>>> def crc(tar,g):
...     ys=0
...     for c in tar:
...         c=ord(c) #value of ascII
...         c+=ys>>8
...         c<<=16
...         c=c%g
...         ys=ys&0xff
...         ys<<=8
...         ys+=c
...         ys=ys%g
...     result=g-ys
...     print '%x'%result
...     return result
... 
>>> crc('this is a test',p)
77fd


可不可以出个C版,这个实在看不懂。。