是" Word"来自Delphi的一个等价的变量" Char"在Java?

时间:2015-01-28 11:45:31

标签: java delphi pascal delphi-xe5 modbus

在Delphi中,Word是16位无符号变量(0..65535)

  

http://www.delphibasics.co.uk/RTL.asp?Name=Word

Java中的char变量是一个16位Unicode变量(0..65535)

  

http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html

我在Delphi上有以下代码

procedure TForm1.ReadHoldRegisters(var lst: TList<byte>; deviceaddr: byte;
  RegisterAddress, RegisterLength: word);
begin

  lst.Add(deviceaddr);
  lst.Add(3);
  lst.Add(RegisterAddress div 256);
  lst.Add(RegisterAddress mod 256);
  Add_CRC16(lst);
end;

procedure TForm1.Add_CRC16(var Data: TList<byte>);
var
  CRC16Lo, CRC16Hi, CL, CH, SaveHi, SaveLo: byte;
  Flag: Integer;
  b: byte;
begin
  CRC16Lo := $FF;
  CRC16Hi := $FF;
  CL := $1;
  CH := $A0;

  for b in Data do
  begin
    CRC16Lo := CRC16Lo Xor b;
    For Flag := 0 To 7 Do
    Begin
      SaveHi := CRC16Hi;
      SaveLo := CRC16Lo;
      CRC16Hi := CRC16Hi Div 2;
      CRC16Lo := CRC16Lo Div 2;

      If ((SaveLo And $1) = $1) Then
      Begin
        CRC16Hi := CRC16Hi Xor CH;
        CRC16Lo := CRC16Lo Xor CL;
      End;



    End;
  end;
  Data.Add(CRC16Lo);
  Data.Add(CRC16Hi);
end;

它相当于Java

    public void ReadHoldRegisters(List<Byte> lst, byte deviceaddr, char RegisterAddress, char RegisterLength)
        {

            lst.add(deviceaddr);
            lst.add((byte) 3);
            lst.add((byte) (RegisterAddress/256));
            lst.add((byte) (RegisterAddress%256));

            Add_CRC16(lst);

        }

    private void Add_CRC16(List<Byte> Data)
    {
        char  SaveLo, SaveHi;
        int flag;


        char CRC16Lo =  0xFF;
        char CRC16Hi =  0xFF;
        char CL      =  0x1;
        char CH      =  0xA0;


        // início do for in
        for (Byte b : Data)
        {
            CRC16Lo = (char) ((CRC16Lo) ^ b);
            for(flag=0;flag<7;flag++)
            {
                SaveHi = CRC16Hi;
                SaveLo = CRC16Lo;
                CRC16Hi = (char) (CRC16Hi/2);
                CRC16Lo = (char) (CRC16Lo/2);
/*
                if((SaveHi & 0x1) == 0x1 )
                {
                    CRC16Lo = ((char) (CRC16Lo|0x80));
                }
*/
                if((SaveLo & 0x1) == 0x1 )
                {
                    CRC16Hi = ((char) (CRC16Hi^CH));
                    CRC16Lo = ((char) (CRC16Lo^CL));

                }
            }
        }
        // fim do for in

        CRC16Hi = (char) (CRC16Hi & 0xffff);
        CRC16Lo = (char) (CRC16Lo & 0xffff);

        Data.add((byte) CRC16Lo);
        Data.add((byte) CRC16Hi);

    }

当我通过

打印值时
for (Byte b : lst)
S = S + String.format("%1X ", b);

我在Delphi上获得01 03 00 20 F0,在Java上获得1 3 0 D8 D9

假设char和word是等效变量,RegisterAddress和RegisterLength我的代码出了什么问题?

2 个答案:

答案 0 :(得分:3)

当然,WideChar(经典Delphi)或Char(Delphi 2009以后)会更合适吗?

答案 1 :(得分:3)

正如您所说,Delphi Word是无符号16位类型。 Java char同样是无符号16位类型。

但是,您在问题中提到了Word,但它没有出现在代码中。好吧,您在Word中使用ReadHoldRegisters但在Add_CRC16中没有使用Word类型。所以,你没有使用Word。您正在使用Byte。因此,Add_CRC16的两个变体因此而显着不同。

我没有看过剩下的代码,但是Delphi中的8位Byte和Java中的16位char之间的不匹配是最明显的问题。首先解决这个问题,看看接下来会发生什么。

最后,我建议您避开Delphi Basics网站,特别是参考资料。官方文档可以为您提供更好的服务。此问题的相关文档为Delphi Data Types