另一个Delphi到Java移植问题
发布时间:2020-12-15 09:20:30 所属栏目:大数据 来源:网络整理
导读:我正在将用Delphi编写的旧应用程序移植到 Java中. 我在使用此函数时遇到了一些麻烦,它会计算传输消息的CRC. 这是原始代码: if(ReceivedMessage[slot].Message[1] = $FD) and (ReceivedMessage[slot].MessageLength in [1..16]) and (ReceivedMessage[slot].
我正在将用Delphi编写的旧应用程序移植到
Java中.
我在使用此函数时遇到了一些麻烦,它会计算传输消息的CRC. 这是原始代码: if(ReceivedMessage[slot].Message[1] = $FD) and (ReceivedMessage[slot].MessageLength in [1..16]) and (ReceivedMessage[slot].Message[counter] = $FF) then begin index := 2; ReceivedMessage[slot].DataReady := TRUE; for counter := 1 to ReceivedMessage[slot].MessageLength do begin Inc(index); if ReceivedMessage[slot].Message[index] < $F8 then ReceivedMessage[slot].Data[counter] := ReceivedMessage[slot].Message[index] else if ReceivedMessage[slot].Message[index] = $F8 then begin Inc(index); ReceivedMessage[slot].Data[counter] := ReceivedMessage[slot].Message[index] or $F0; end else ReceivedMessage[slot].DataReady := FALSE; // Invalid data end; if ReceivedMessage[slot].DataReady = TRUE then begin Inc(index); if ReceivedMessage[slot].Message[index] < $F8 then ReceivedMessage[slot].CRC := ReceivedMessage[slot].Message[index] shl 8 else if ReceivedMessage[slot].Message[index] = $F8 then begin Inc(index); ReceivedMessage[slot].CRC := (ReceivedMessage[slot].Message[index] or $F0) shl 8; end; Inc(index); if ReceivedMessage[slot].Message[index] < $F8 then ReceivedMessage[slot].CRC := ReceivedMessage[slot].CRC or ReceivedMessage[slot].Message[index] else if ReceivedMessage[slot].Message[index] = $F8 then begin Inc(index); ReceivedMessage[slot].CRC := ReceivedMessage[slot].CRC or ReceivedMessage[slot].Message[index] or $F0; end; 这是我的Java代码: if(array[1]==0xFD && (array[2]>0 && array[2]<17) && array[pos]==(byte)0xFF) { index=2; for(int counter=1;counter<splMsg.nbytes+1;counter++) { index++; if(array[index]<0xF8) data[counter]=array[index]; else if(array[index]==0xF8) { index++; data[counter]=(byte)(array[index] | 0xF0); } else return 0xFC; } index++; short crc=0x0000; if(array[index]<0xF8) crc=(short) (array[index]<<8); else if(array[index]==0xF8) { index++; crc=(short)((array[index] | 0xF0) << 8); } index++; if(array[index]<0xF8) crc=(short) (crc | array[index]); else if(array[index]==0xF8) { index++; crc=(short)(crc | array[index] | 0xF0); } msgcrc=new byte[] {(byte)(crc >> 8 & 0xff),(byte)(crc & 0xff)}; 我的函数大多数时间返回传输的CRC代码,但有时会失败并返回消息的最后两个字节.消息的最后3个字节是CRC码(2字节)和消息结束0xff字节. 有帮助吗? 谢谢, 解决方法
记得:
Java字节已签名.所以: byte test = (byte)255; System.out.println(test); 将输出:-1 和 byte test = (byte)255; System.out.println(test == 255); 将打印出错,但是 byte test = (byte)255; System.out.println((test & 255) == 255); 会做我认为你想要达到的目标(在这种情况下打印为true). 要获得无符号(字节)值,请使用(array [index]& 255). 您将不得不在任何地方使用0xff进行屏蔽,否则您将获得大于127的字节值的符号扩展整数. 对于比较,您也可以始终执行转换为字节(例如if(test ==(byte)255))但我认为应该坚持单个转换,所以我建议使用& 0xff掩蔽. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |