gpt4 book ai didi

基于J.G.的校验和算法弗莱彻

转载 作者:行者123 更新时间:2023-12-04 10:10:59 28 4
gpt4 key购买 nike

我的任务是实现基于 J.G. 的校验和算法。 Fletcher 校验和和 ISO 8473-1:1998 是这样描述的:

enter image description here

然后他们列出了 4 个数据,可以检查这些数据以查看算法是否正确,但我的版本在最后两个值上失败了。
0000 给出了 FFFF 的校验和
0000'00 给出了 FFFF 的校验和
ABCDEF'01 给出的校验和为 9CF8
1456'F89A'0001给出了24DC的校验和

我已经为此工作了几个小时,但找不到我做错了什么,一双新眼睛可能会有很大帮助。

这是我的功能:

uint16 Crc_CalculateISOChecksum(uint8 *pt_start_address, uint32  length)
{
uint8 C0, C1;
uint8 data;
uint32 i;
uint8 ck1, ck2;

/* Initial value */
C0 = 0;
C1 = 0;

/* memories - 32bits wide*/
for (i=0; i<length; i++) /* nb_bytes has been verified */
{
data = pt_start_address[i];
C0 = (C0 + data)%255;
C1 = (C1 + C0)%255;
}
/* Calculate the intermediate ISO checksum value */
ck1 = (unsigned char)(255-((C0+C1)%255));
ck2 = (unsigned char)(C1%255);
if (ck1 == 0)
{
ck1 = MASK_BYTE_LSB;
}
if (ck2 == 0)
{
ck2 = MASK_BYTE_LSB;
}
return ((((uint16)ck1)<<8) | ((uint16)ck2));
}

最佳答案

您的中间总和应为 uint16_t(或您的行话中的 uint16)。

uint16_t C0, C1; // Not uint8_t.

取决于什么charint在您的系统上(例如,不要假设 int 的位数多于 char)您的中间总和可能溢出。您的实现依赖于提升 uint8_t。

举例说明:

 0xFF               0xFF
+0xFF +0xFF
===== =====
0x1FE % 255 = 0 0xFE % 255 = 254
^Retain ^Drop

关于基于J.G.的校验和算法弗莱彻,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8315215/

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