高手都死光了??还是被钱迷住了??一个效验的问题我用了600分都问不出一个结果,还叫什么大富翁论坛?!!!(200分)

  • 主题发起人 crazycock
  • 开始时间
C

crazycock

Unregistered / Unconfirmed
GUEST, unregistred user!
http://www.delphibbs.com/delphibbs/DispQ.asp?LID=1386952
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1385808
我的问题难道DELPHI出现这么多年没有哪个人遇到过????
=============
协议上说用的效验方法是CRC16(CCITT),下方的数据,括号内是设备发送的字符串的效验码,
也就是说,由括号外面的数据,通过效验,得到括号里面的内容,我现在查了那么多资料,都
胡涂了,弄不清楚到底是我的CRC16效验没有算对,还是设备有问题,毕竟人家设备是国际上成
熟的产品,没有弄清楚我的效验计算是否正确之前,我不敢枉下结论。
16,2,6,0,6,0,1,64,16,3,(241,36),复位
16,2,6,0,6,0,1,8,16,3,(49,144),静音
16,2,6,0,6,0,1,32,16,3,(244,105),隔离i
我的要求很简单,就是想大家算一下,自己通过效验,能得到什么结果。
我的结果是 :
复位:$18A8(多项式为$1021),$0178(多项式为$8005)
静音:$165A(多项式为$1021),$B5C5(多项式为$8005)
隔离:$1D9D(多项式为$1021),$2AEE(多项式为$8005)
这些答案是根据http://tech.enet.com.cn/document/20010903/20010903112642011.shtml计算得到的。
如果用另外一个朋友给的方法,计算又是另外一个答案。
希望能有人能告诉我,什么才是标准的答案,我盼望那一时刻。
 
16,2,6,0,6,0,1,64,16,3,(241,36),复位
16,2,6,0,6,0,1,8,16,3,(49,144),静音
16,2,6,0,6,0,1,32,16,3,(244,105),隔离i

再仔细查一下你上面的数据是否获取是否正确?
 
大富翁都去渡假了。。。
 
我沒玩過
 
数据绝对没有错误,至少我算出我自己的效验码了,大家也算一下自己的嘛,如果我们的
相同,至少能说明一些问题。
 
建议斑竹把这臭小子帖子给删了、把这臭小子帐号给封了!!!
是不是要回去补上小学的课程——五讲、四美...;真是没教养!!!
 
回desertsmoke:只要你把我的问题解决了,别说封我帐号,就是让我叫你爷都成!
不要说我什么臭小子,香小子,你有心相助就帮忙查一下手头的资料,无心解决就帮忙
up一下,比你现在罗罗说说有用多。
 
我遇到过,看看是不是变量的类型不对
 
to crazycock
这么长时间还没有解决问题,你也真够可怜的了。
  我这两天又看了一下关于crc-16和crc-ccitt的书,我自己也不明白了,我对那几个多项
式有点搞不明白了,我根据书上写的r位校验码应该用r+1位生成多项式得出,得到多项式应该是
是$18005和$11021(16位CRC应该有17位的生成多项式),但计算的时候好像并没有影响,我也糊涂了。
我想手工算一下,但式子太长了,:-(
 
回yangxiangjun:变量的类型,刚开始的时候我确实弄错了,不过现在改正了,而且我参考了
很多人的程序,包括国外的,算出来的结果还没有一样的。
回resun:谢谢你一直以来的帮助,你说的这些资料我也看了,大概的原理是明白了,但是,算
出来的结果还是不如人意:)
 
crazycock,既然你用Delphi,说明你是一个聪明的程序员,
聪明的程序员要用聪明的办法解决,悄悄地告诉你,我见过
大把这样的控件,你去下载一个用就可以了,别在这里鬼哭狼嚎的
 
楼主,很洋的问题啊,小弟没学过,up吧。。。
 
回SS2000:谢谢兄弟关心,你所想到的,依靠别人现成控件来完成的方法我也想到了,我
下载了好几个,不过都是完成文件的CRC效验的,不知道如何来完成字符串的效验,不过就
这样的控件,我用来效验同一个文本文件,同一种效验方式,同一效验式,竟然还是有不
同答案,晕……
要是不信,给个信箱,我给你发过去尝试尝试:)
回cb_hfxy:多谢抬举。
 
Function CRCCheck(data:string):string;
//功能:计算CCITT的CRC校验
//参数:data-要计算的数据
//返回:2个字节的校验和
var
i,j:integer;
Count,Poly,Accum,CheckSum:Word;
CRCTable:array[1..256]of Word;
begin
try
//计算校验表
for i:=1 to 256 do
begin
poly:=$1021;
accum:=0;
count:=i-1;
count:=count shl 8;

for j:=0 to 7 do
begin
if((count xor accum) and $8000)>0 then
begin
accum:=(accum shl 1) xor poly;
end
else
begin
accum:=accum shl 1;
end;
count:=count shl 1;
end;
CRCTable:=accum;
end;

//计算CRC值
checksum:=0; {据说也有:checksum:=$FFFF的,不过俺们就是那个0}
for i:=1 to length(Data) do
begin
checksum:=(checksum shl 8) xor CRCTable[1+((checksum shr 8) xor ord(Data))];
end;
result:=chr(Checksum div 256);
result:=chr(Checksum mod 256)+result;
except
result:='';
end;
end;
 
会不会是指校验一部分呢? 因为我发现命令串中包含很多相同的字符,也许校验和
只是针对其中几位的。
 
回LuJuhe:我也这样想过了。我逐个减少内容,然后都没有算出来需要的结果,况且协议上写着
The CRC includes everything from the first DLE to the ETX.,所以这样想应该是不对的。
回Jar:我去测试一下。
 
回Jar:经过计算,呵呵~~又是不出我所料,Jar的算法得到的结果既不同于我的答案,也
不同于从设备上采集的数据,至于和以前我下载和收集的CRC计算方法有没有相同计算结果,
目前还没有去分析,真实五花八门,啥结果都有,晕……
 
俺没搞过,俺也不是高手
 
好消息,这是厂家给的效验公式,但是我还没有能够算出和测量的数据相同的CRC值,请大家帮忙看看。
Here is the C code necessary to generate a CRC-16 CCiTT.

unsigned short CRC ( const char *buffer, int buflen )
{
unsigned crc = 0;
int q;

for ( int i = 0; i < buflen; i++ )
{
q = ( crc ^ buffer[ i ] &amp; 15;
crc = ( crc >> 4 ) ^ ( q * 4225 );
q = ( crc ^ ( buffer[ i ] >> 4 )) &amp; 15;
crc = ( crc >> 4 ) ^ ( q * 4225 );
}
return (unsigned short ) crc;
}

The packet format is as follows:

Byte |
Order: | DLE | STX | Command | Network ID | Zone ID | Sector ID | Data | DLE | ETX | CRC |
======|===================================================================|
Num of | 1 | 1 | 1 | 1 | 1 | 1 | [0 -128]| 1 | 1 | 2 |

The data transmission is big-endian (for smoke level the Hi byte is sent first followed by the Lo byte).
 
我算了一下,还是算不出来
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
I
回复
0
查看
552
import
I
I
回复
0
查看
547
import
I
顶部