担心对方收到错误的信息。然而,无论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
A
#
输出:
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)
每次从输入读取1个字符c;
计算 ys=(ys*2^8 + c) mod g
那么最终的结果为:
g- (ys*2^16 mod g)
#2
网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
#3
网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,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
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一样
开始余数为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
可不可以出个C版,这个实在看不懂。。
#1
刚开始时,余数ys为0;
每次从输入读取1个字符c;
计算 ys=(ys*2^8 + c) mod g
那么最终的结果为:
g- (ys*2^16 mod g)
每次从输入读取1个字符c;
计算 ys=(ys*2^8 + c) mod g
那么最终的结果为:
g- (ys*2^16 mod g)
#2
网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,CRC早已被研究得很透彻了,你何不去学会站在巨人的肩上吗?
#3
网上讲CRC的资料成堆成堆的。你就不会搜一下吗?
这种东西,光靠想不是那么容易想得出来的。作为通讯工程的基础技术之一,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
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一样
开始余数为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
可不可以出个C版,这个实在看不懂。。