В Delphi Word представляет собой 16-битную неподписанную переменную (0..65535)
Переменная 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?
Как вы сказали, 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.
Разумеется, более подходящим является WideChar (классический Delphi) или просто Char (Delphi 2009)?
Char
ни WideChar
имеют большого смысла в коде Delphi, потому что это не текстовая операция. Код Java использует char
, предположительно, потому что это единственный неподписанный тип в языке. Delphi Word
- хороший выбор.
Word
- 16-битный тип без знака. Я думаю, что Javachar
то же самое. Возможно ли, что разница порядковая. Java с прямым порядком байтов, Delphi с прямым порядком байтов.