Является ли «Word» из Delphi эквивалентной переменной «Char» в Java?

1

В Delphi Word представляет собой 16-битную неподписанную переменную (0..65535)

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

Переменная char в Java представляет собой 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);

Я получаю 01 03 00 20 F0 на Delphi и 1 3 0 D8 D9 на Java.

Предполагая, что символ и слово являются эквивалентными переменными, что происходит с регистрами RegisterAddress и RegisterLength?

  • 1
    Delphi Word - 16-битный тип без знака. Я думаю, что Java char то же самое. Возможно ли, что разница порядковая. Java с прямым порядком байтов, Delphi с прямым порядком байтов.
  • 3
    Мое другое предложение состоит в том, что вы делаете некоторую отладку. Зачем быть беспомощным? Получите каждую программу для записи промежуточных значений. Узнайте, где программы расходятся. Тогда вы поймете проблему. И сможете решить это самостоятельно.
Показать ещё 6 комментариев
Теги:
modbus
pascal
delphi-xe5

2 ответа

3
Лучший ответ

Как вы сказали, Word Delphi представляет собой неподписанный 16-битный тип. Java char также является беззнаковым 16 битным типом.

Однако вы указываете Word в вопросе, но он не отображается в коде. Ну, вы используете Word в ReadHoldRegisters но нигде в Add_CRC16 не используется тип Word. Таким образом, вы не используете Word. Вы используете Byte. Из-за этого два варианта Add_CRC16 значительно отличаются.

Я не смотрел на остальную часть кода, но несоответствие между 8-битным Byte в Delphi и 16-битным char в Java является самой яркой проблемой. Начните с исправления этой проблемы и посмотрите, что будет дальше.

В заключение я рекомендую вам избегать веб-сайта Delphi Basics, особенно для справочных материалов. Официальную документацию вы гораздо лучше обслуживаете. Соответствующей документацией по этому вопросу являются типы данных Delphi.

  • 0
    ..... RegisterAddress, RegisterLength: word)
  • 0
    Да. Что из остального вашего кода?
Показать ещё 1 комментарий
3

Разумеется, более подходящим является WideChar (классический Delphi) или просто Char (Delphi 2009)?

  • 0
    Не могли бы вы объяснить это более конкретно? Код Delphi работает так, как и должно быть. Ява там может что-то упустить.
  • 3
    @ penarthur66 Ни Char ни WideChar имеют большого смысла в коде Delphi, потому что это не текстовая операция. Код Java использует char , предположительно, потому что это единственный неподписанный тип в языке. Delphi Word - хороший выбор.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню