#include <stdlib.h>
#include <stdio.h>
typedef unsigned short int uint16_t;
typedef unsigned int uint32_t;
typedef unsigned char uint8_t;
struct TestSpeedReq {
uint32_t magic;
uint16_t pkt_len;
uint16_t ver;
uint16_t crc;
uint8_t type;
uint32_t seq;
};
static inline uint32_t __buffer_raw_cksum(const void *buf, uint32_t len, uint32_t sum)
{
/* workaround gcc strict-aliasing warning */
uintptr_t ptr = (uintptr_t)buf;
const uint16_t *u16 = (const uint16_t *)ptr;
while (len >= (sizeof(*u16) * 4)) {
sum += u16[0];
sum += u16[1];
sum += u16[2];
sum += u16[3];
len -= sizeof(*u16) * 4;
u16 += 4;
}
while (len >= sizeof(*u16)) {
sum += *u16;
len -= sizeof(*u16);
u16 += 1;
}
/* if length is in odd bytes */
if (len == 1)
sum += *((uint8_t *)u16);
return sum;
}
static inline uint16_t __buffer_raw_cksum_reduce(uint32_t sum)
{
sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
sum = ((sum & 0xffff0000) >> 16) + (sum & 0xffff);
return (uint16_t)sum;
}
static inline uint16_t buffer_raw_cksum(const void *buf, size_t len)
{
uint32_t sum;
uint16_t cksum;
sum = __buffer_raw_cksum(buf, len, 0);
cksum = __buffer_raw_cksum_reduce(sum);
cksum = (~cksum) & 0xffff;
if (cksum == 0)
cksum = 0xffff;
return cksum;
}
int main(int argc, char **argv)
{
struct TestSpeedReq req;
int i = 0;
for (i = 0; i < 100; i++) {
req.crc = 0;
req.magic = 100 + i;
req.pkt_len = sizeof(struct TestSpeedReq);
req.seq = 99;
req.type = 77;
req.ver = 4;
uint16_t csum = buffer_raw_cksum((void *)&req, sizeof(req));
req.crc = csum;
printf("cusm %x",csum);
uint16_t csum1 = buffer_raw_cksum((void *)&req, sizeof(req));
printf(" cusm1 %x\n",csum1);
}
return 0;
}
校驗和計算
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章
linux 進程調度策略
already_skb
2020-07-01 19:47:32
C 語言 類型強制轉換問題
already_skb
2020-02-26 01:39:21
兩個單鏈表合併
already_skb
2020-02-26 01:39:21
linx x86 彙編
already_skb
2020-02-26 01:39:21
svn微型服務器搭建
already_skb
2020-02-26 01:39:21
判斷一個整數是否是n^m次方類型數據,並比較乘法和除法性能差異
already_skb
2020-02-26 01:39:21
centos 7 取消LOG輸出限制
already_skb
2018-09-02 02:47:41
串口重定向
SYLAS_LINUX
2018-09-01 19:45:37
大小端示例
SYLAS_LINUX
2018-09-01 19:43:16
settimer示例
SYLAS_LINUX
2018-09-01 19:43:16
24小時熱門文章