Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/362.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
另一个Delphi到Java的移植问题_Java_Delphi_Binary_Porting - Fatal编程技术网

另一个Delphi到Java的移植问题

另一个Delphi到Java的移植问题,java,delphi,binary,porting,Java,Delphi,Binary,Porting,我正在将一个用Delphi编写的旧应用程序移植到Java。 我在使用这个函数时遇到了一些问题,它计算传输消息的CRC 以下是原始代码: if(ReceivedMessage[slot].Message[1] = $FD) and (ReceivedMessage[slot].MessageLength in [1..16]) and (ReceivedMessage[slot].Message[counter] = $FF) then

我正在将一个用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;
if(ReceivedMessage[slot]。消息[1]=$FD)和
(ReceivedMessage[slot].MessageLength在[1..16]中)和
(ReceivedMessage[slot]。Message[counter]=$FF)然后
开始
指数:=2;
ReceivedMessage[slot].DataReady:=TRUE;
对于计数器:=1以接收消息[slot]。消息长度do
开始
公司(指数),;
如果ReceivedMessage[slot]。Message[index]<$F8,则
ReceivedMessage[slot]。数据[计数器]:=ReceivedMessage[slot]。消息[索引]
其他的
如果ReceivedMessage[slot].Message[index]=$F8,则
开始
公司(指数),;
ReceivedMessage[slot]。数据[counter]:=ReceivedMessage[slot]。消息[index]或$F0;
结束
其他的
ReceivedMessage[slot]。DataReady:=FALSE;//无效数据
结束;
如果ReceivedMessage[slot].DataReady=TRUE,则
开始
公司(指数),;
如果ReceivedMessage[slot]。Message[index]<$F8,则
ReceivedMessage[slot]。CRC:=ReceivedMessage[slot]。消息[index]shl 8
其他的
如果ReceivedMessage[slot].Message[index]=$F8,则
开始
公司(指数),;
ReceivedMessage[slot]。CRC:=(ReceivedMessage[slot]。Message[index]或$F0)shl 8;
结束;
公司(指数),;
如果ReceivedMessage[slot]。Message[index]<$F8,则
ReceivedMessage[slot]。CRC:=ReceivedMessage[slot]。CRC或ReceivedMessage[slot]。消息[index]
其他的
如果ReceivedMessage[slot].Message[index]=$F8,则
开始
公司(指数),;
ReceivedMessage[slot]。CRC:=ReceivedMessage[slot]。CRC或ReceivedMessage[slot]。消息[index]或$F0;
结束;
下面是我的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)};
if(数组[1]==0xFD&&(数组[2]>0&&array[2]记住:

Java字节是有符号的。因此:

将输出:
-1

将打印
false
,但

    byte test = (byte)255;
    System.out.println((test & 255) == 255);
将执行我认为您希望实现的操作(在本例中,打印
true

要获取无符号(字节)值,请使用
(数组[索引]&255)

您必须在所有位置使用0xff进行掩蔽,否则将得到大于127的字节值的符号扩展整数


对于比较,您也可以对
byte
(例如
if(test==(byte)255)
)进行转换,但我认为应该坚持单一转换,因此我建议使用
&0xff
掩蔽。

byte
类型的“数组”吗?嗨,不是,数组是字节[]@Pedro除了另一个Delphi to Java移植问题
,你能为你的问题想出一个更具描述性的标题吗?谢谢你,Neet。我已经在每个数组[索引]中添加了掩码,它成功了!
    byte test = (byte)255;
    System.out.println(test == 255);
    byte test = (byte)255;
    System.out.println((test & 255) == 255);