gpt4 book ai didi

java - 在没有 unsigned int 的情况下将 CRC16 函数从 C 转换为 JAVA 时出现问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:11:07 25 4
gpt4 key购买 nike

我必须为固件更新创建 CRC16 校验和。当我发送此数据时(从十六进制字符串转换为字节[])

020000810000120000000002F001128100000C9462050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C9481050C94

我从 Controller 得到以下 CRC16

-17514

现在我尝试在 Java 中检查它,但我无法获得相同的值。

这是 C 中的原始函数:

static uint16_t crc16_update(uint16_t crc, uint8_t a)
{
crc ^= a;
for (unsigned i = 0; i < 8; ++i) {
if (crc & 1)
crc = (crc >> 1) ^ 0xA001;
else
crc = (crc >> 1);
}
return crc;
}


static uint16_t crc16(const uint8_t *b, size_t l)
{
uint16_t crc = 0;
while (l-- > 0)
crc = crc16_update(crc, *b++);
return crc;
}

这是我在 java 中转换后的函数:

public static int crc16_update(int crc, int a) {
crc ^= a;
for (int i = 0; i < 8; ++i) {
if ((crc & 1) != 0) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc = (crc << 1);
}
}
return crc;
}

public static int crc16(byte[] bytes) {
int crc = 0;
for (byte b:bytes) {
crc = crc16_update(crc, b);
}
return crc;
}

...但是它不起作用。有什么问题吗?

最佳答案

public static int crc16_update(int crc, int a) {
crc ^= a;
for (int i = 0; i < 8; ++i) {
if ((crc & 1) != 0) {
crc = (crc >> 1) ^ 0xA001;
} else {
crc = (crc << 1);

作为mentioned by looper ,你在 C 代码中有一个 >> 1

        }
}
return crc;
}

现在是另一个功能:

public static int crc16(byte[] bytes) {
int crc = 0;
for (byte b:bytes) {
crc = crc16_update(crc, b);

crc16_update 在 Java 中采用 int 作为第二个参数,在 C 中采用 uint8_t。当字节 b设置了最高有效/符号位,值为负,因此当转换为 int 作为 crc16_update 的参数时,符号扩展,因此你得到很多 1 -C 中没有的位。

您需要屏蔽除最低有效 8 位以外的所有位,

crc16_update(crc, ((int)b) & 0xFF);

关于java - 在没有 unsigned int 的情况下将 CRC16 函数从 C 转换为 JAVA 时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13529510/

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