Delphi 中的 "Word" 是 Java 上的 "Char" 的等效变量吗?
Is "Word" from Delphi an equivalent variable to "Char" on Java?
在Delphi中,一个Word是一个16位无符号变量(0..65535)
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 := ;
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 ) = ) 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 出了什么问题?
肯定是 WideChar(经典 Delphi)或 Char(Delphi 2009 起)更合适?
正如你所说,Delphi Word
是一个无符号的 16 位类型。 Java char
同样是无符号 16 位类型。
然而,你在问题中提到了Word
,但它没有出现在代码中。好吧,您在 ReadHoldRegisters
中使用了 Word
,但在 Add_CRC16
中没有任何地方使用了 Word
类型。所以,您没有使用 Word
。您正在使用 Byte
。因此,Add_CRC16
的两个变体因此存在显着差异。
我没有查看其余代码,但是 Delphi 中的 8 位 Byte
和 Java 中的 16 位 char
之间的不匹配是最明显的问题。从解决这个问题开始,看看接下来会发生什么。
最后,我建议您避开 Delphi 基础知识网站,尤其是参考 material。官方文档会更好地为您服务。这个问题的相关文档是Delphi Data Types.
在Delphi中,一个Word是一个16位无符号变量(0..65535)
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 := ;
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 ) = ) 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 出了什么问题?
肯定是 WideChar(经典 Delphi)或 Char(Delphi 2009 起)更合适?
正如你所说,Delphi Word
是一个无符号的 16 位类型。 Java char
同样是无符号 16 位类型。
然而,你在问题中提到了Word
,但它没有出现在代码中。好吧,您在 ReadHoldRegisters
中使用了 Word
,但在 Add_CRC16
中没有任何地方使用了 Word
类型。所以,您没有使用 Word
。您正在使用 Byte
。因此,Add_CRC16
的两个变体因此存在显着差异。
我没有查看其余代码,但是 Delphi 中的 8 位 Byte
和 Java 中的 16 位 char
之间的不匹配是最明显的问题。从解决这个问题开始,看看接下来会发生什么。
最后,我建议您避开 Delphi 基础知识网站,尤其是参考 material。官方文档会更好地为您服务。这个问题的相关文档是Delphi Data Types.