gpt4 book ai didi

java - Delphi字节操作与Java

转载 作者:行者123 更新时间:2023-12-02 07:14:27 25 4
gpt4 key购买 nike

我在 Delhpi 中有这个函数,可以计算传输消息的 CRC。此函数应返回 2 字节 CRC,但是,对于某些消息,CRC 长度为 3 字节。

这里有几个例子:

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

消息0588080168F0 -->计算CRC(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;

这是我的 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)};
}

使用此方法,我将十六进制字符串转换为字节数组:

  private static byte[] hexToBytes(String s) 
{
int len = s.length();
byte[] data = new byte[len / 2];
for (int i = 0; i < len; i += 2)
{
data[i / 2] = (byte) ((Character.digit(s.charAt(i), 16) << 4) + Character.digit(s.charAt(i+1), 16));
}
return data;
}

我的代码适用于 2 字节 CRC,但无法在 3 字节消息上提供正确的 CRC...有什么帮助或想法吗?谢谢,佩德罗

最佳答案

在 Delphi 代码的这一部分中:

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 中的 String 索引从 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);

关于java - Delphi字节操作与Java,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15097330/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com