Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/365.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_Porting - Fatal编程技术网

Delphi字节操作与Java

Delphi字节操作与Java,java,delphi,porting,Java,Delphi,Porting,我有一个函数,用Delhpi,它计算一条传输消息的CRC。此函数应返回2字节的CRC,但对于某些消息,CRC长度为3字节 这里有几个例子: 消息0588080168F8-->计算ECRC(0588080168F8,5)=083D9B(3字节) 消息0588080168F0-->计算ECRC(0588080168F0,5)=BC93(2字节) 以下是原始的delphi代码: procedure CalculateCRC(var Message: TMessage); var counter:

我有一个函数,用Delhpi,它计算一条传输消息的CRC。此函数应返回2字节的CRC,但对于某些消息,CRC长度为3字节

这里有几个例子:

消息0588080168F8-->计算ECRC(0588080168F8,5)=083D9B(3字节)

消息0588080168F0-->计算ECRC(0588080168F0,5)=BC93(2字节)

以下是原始的delphi代码:

procedure CalculateCRC(var Message: TMessage);
var
  counter: byte;
  counter1: byte;
begin
  for counter := 1 to Message.MessageLength + 1 do
  begin
    if counter = 1 then
      Message.CRC := 0 xor (word(Message.MessageLength) shl 8)
    else
      Message.CRC := Message.CRC xor (word(Message.Data[counter-1]) shl 8);

    for counter1 := 1 to 8 do
    begin
      if (Message.CRC and $8000) = $8000 then
        Message.CRC := (Message.CRC shl 1) xor $1021
      else
        Message.CRC := Message.CRC shl 1;
    end;
  end;
end;
for counter := 1 to Message.MessageLength + 1 do
  begin
    if counter = 1 then
      Message.CRC := 0 xor (word(Message.MessageLength) shl 8)
    else
      Message.CRC := Message.CRC xor (word(Message.Data[counter-1]) shl 8);
下面是我的Java函数:

  public static byte[] calculateCRC(byte[] msg, int len)
  {
    int crc=0;

    for(int i=1; i<=len+1;i++)
    {
      if(i==1)
        crc= 0 ^ (len<<8);
      else
        crc=crc ^ ((msg[i-1] & 0xff) << 8);

      for(int j=1; j<=8;j++)
      {
        if((crc & 0x8000) == 0x8000)
          crc= (crc <<1 ) ^ 0x1021;
        else
          crc= (crc <<1 ) ;
      }
    }

    return new byte[] {(byte)((crc >>16) & 0xff),(byte) ((crc>>8) & 0xff),(byte)(crc & 0xff)};
  }
public static byte[]calculaterc(byte[]msg,int len)
{
int-crc=0;

对于Delphi代码这一部分中的(int i=1;i:

procedure CalculateCRC(var Message: TMessage);
var
  counter: byte;
  counter1: byte;
begin
  for counter := 1 to Message.MessageLength + 1 do
  begin
    if counter = 1 then
      Message.CRC := 0 xor (word(Message.MessageLength) shl 8)
    else
      Message.CRC := Message.CRC xor (word(Message.Data[counter-1]) shl 8);

    for counter1 := 1 to 8 do
    begin
      if (Message.CRC and $8000) = $8000 then
        Message.CRC := (Message.CRC shl 1) xor $1021
      else
        Message.CRC := Message.CRC shl 1;
    end;
  end;
end;
for counter := 1 to Message.MessageLength + 1 do
  begin
    if counter = 1 then
      Message.CRC := 0 xor (word(Message.MessageLength) shl 8)
    else
      Message.CRC := Message.CRC xor (word(Message.Data[counter-1]) shl 8);
您的计算范围是从1到MessageLength+1。逻辑似乎暗示Message.Data中的第一个索引是1。因此,我猜这段代码基于以下事实:Delphi中的字符串索引从1开始。但在Java中并非如此,它们从0开始。因此,您可能应该这样重写Java方法:

    for (int i = 0; i <= len; i++)
    {
        if (i == 0)
            crc = 0 ^ (len << 8);
        else
            crc = crc ^ ((msg[i - 1] & 0xff) << 8);

用于(int i=0;我总是使用带有
if
else
的花括号,即使您只需要一个操作。这将提高代码的可读性,并可能修复当前错误。根据您的代码格式,我猜您希望代码有其他行为。您可以发布示例i/p和o/p以及预期结果吗?Fr我不知道这是否是问题的根源,但请注意,在Java中,字节是有符号的,而在Delphi中,字节是无符号的。@amandepjiddewar预期结果在我的帖子中。对于第一条消息(带有3个字节的CRC)我的函数在应该返回083D9B时返回FB3D9B。您能否验证delphi版本是否返回
083D9B
(您希望java返回的内容)而不是
FB3D9B
(java返回的内容)。此建议将方法结果从083D9B更改为F34F93!:)正确答案是083D9B。Thanks@Pedro:基于此注释,您当前的结果和正确的结果是相同的。您的问题解决了吗?您如何使用此方法?我正在尝试
byte bytes[]={0x05,(byte)0x88,0x08,0x01,0x68,(byte)0xF8};byte[]calculaterc=calculaterc(bytes,bytes.length)
。你就是这么做的吗?@jlordo:对不起,我弄错了。该方法返回FB3D9B,根据建议的更改,返回F34F93,正确的CRC为083D9B。Uff!@CyrilleKarmann:不,05880801068F8是十六进制字符串。我先将其转换为字节数组。请参阅我编辑的帖子。