Tag: checksum

是否存在可用于在POSIX程序中计算TCP段校验和的预先存在的函数或代码

我正在写一个小POSIX程序,我需要计算TCP段的校验和,我想使用现有的函数,以避免自己写一个。 像(伪代码)的东西: char *data = …. u16_integer = computeChecksum(data); 我在网上搜索但我找不到正确的答案,有什么建议吗?

MODBUS RTU CRC16计算

我用C编写了一个MODBUS CRC16计算器。我之前有一个python做这个,我想把它转换成C.我在网上发现了一些代码,但它没有给我正确的答案。 对于我的python代码,我把它作为我的CRC16.py #!/usr/bin/env python def calc(data): crc_table=[0x0000,0xC0C1,0xC181,0x0140,0xC301,0x03C0,0x0280,0xC241,0xC601,0x06C0,0x0780,0xC741,0x0500,0xC5C1,0xC481,0x0440,0xCC01,0x0CC0,0x0D80,0xCD41,0x0F00,0xCFC1,0xCE81,0x0E40,0x0A00,0xCAC1,0xCB81,0x0B40,0xC901,0x09C0,0x0880,0xC841,0xD801,0x18C0,0x1980,0xD941,0x1B00,0xDBC1,0xDA81,0x1A40,0x1E00,0xDEC1,0xDF81,0x1F40,0xDD01,0x1DC0,0x1C80,0xDC41,0x1400,0xD4C1,0xD581,0x1540,0xD701,0x17C0,0x1680,0xD641,0xD201,0x12C0,0x1380,0xD341,0x1100,0xD1C1,0xD081,0x1040,0xF001,0x30C0,0x3180,0xF141,0x3300,0xF3C1,0xF281,0x3240,0x3600,0xF6C1,0xF781,0x3740,0xF501,0x35C0,0x3480,0xF441,0x3C00,0xFCC1,0xFD81,0x3D40,0xFF01,0x3FC0,0x3E80,0xFE41,0xFA01,0x3AC0,0x3B80,0xFB41,0x3900,0xF9C1,0xF881,0x3840,0x2800,0xE8C1,0xE981,0x2940,0xEB01,0x2BC0,0x2A80,0xEA41,0xEE01,0x2EC0,0x2F80,0xEF41,0x2D00,0xEDC1,0xEC81,0x2C40,0xE401,0x24C0,0x2580,0xE541,0x2700,0xE7C1,0xE681,0x2640,0x2200,0xE2C1,0xE381,0x2340,0xE101,0x21C0,0x2080,0xE041,0xA001,0x60C0,0x6180,0xA141,0x6300,0xA3C1,0xA281,0x6240,0x6600,0xA6C1,0xA781,0x6740,0xA501,0x65C0,0x6480,0xA441,0x6C00,0xACC1,0xAD81,0x6D40,0xAF01,0x6FC0,0x6E80,0xAE41,0xAA01,0x6AC0,0x6B80,0xAB41,0x6900,0xA9C1,0xA881,0x6840,0x7800,0xB8C1,0xB981,0x7940,0xBB01,0x7BC0,0x7A80,0xBA41,0xBE01,0x7EC0,0x7F80,0xBF41,0x7D00,0xBDC1,0xBC81,0x7C40,0xB401,0x74C0,0x7580,0xB541,0x7700,0xB7C1,0xB681,0x7640,0x7200,0xB2C1,0xB381,0x7340,0xB101,0x71C0,0x7080,0xB041,0x5000,0x90C1,0x9181,0x5140,0x9301,0x53C0,0x5280,0x9241,0x9601,0x56C0,0x5780,0x9741,0x5500,0x95C1,0x9481,0x5440,0x9C01,0x5CC0,0x5D80,0x9D41,0x5F00,0x9FC1,0x9E81,0x5E40,0x5A00,0x9AC1,0x9B81,0x5B40,0x9901,0x59C0,0x5880,0x9841,0x8801,0x48C0,0x4980,0x8941,0x4B00,0x8BC1,0x8A81,0x4A40,0x4E00,0x8EC1,0x8F81,0x4F40,0x8D01,0x4DC0,0x4C80,0x8C41,0x4400,0x84C1,0x8581,0x4540,0x8701,0x47C0,0x4680,0x8641,0x8201,0x42C0,0x4380,0x8341,0x4100,0x81C1,0x8081,0x4040] crc_hi=0xFF crc_lo=0xFF for w in data: index=crc_lo ^ ord(w) crc_val=crc_table[index] crc_temp=crc_val/256 crc_val_low=crc_val-(crc_temp*256) crc_lo=crc_val_low ^ crc_hi crc_hi=crc_temp crc=crc_hi*256 +crc_lo return crc 接下来,我将使用脚本输入我的变量: import math import subprocess import serial import time from time import sleep import struct import CRC16 import sys address = chr(0x01) function_code = chr(0x04) start_at_reg = […]

计算C中ICMPv6包的校验和

我正在尝试计算ICMPv6消息的校验和(确切地说,是一个Neighbor Advertisement)。 RFC 4443将其描述为“整个ICMPv6消息的一个补码和的16位补码” 还有一些关于如何做到这一点的示例代码(虽然我认为它来自IPv4,但唯一的区别是总和中包含的内容,而不是如何计算它): RFC 1071 我从wireshark获取了一个数据包,并以主机字节顺序进入短路。 然后我打印正确的校验和,将其归零并计算我的。 但他们不匹配。 根据RFC 1071,endianess不应该是问题(结果不只是字节交换,而是完全关闭)。 根据RFC 2460#8.1,我需要在计算中包含“伪标头”,仅包含Src + Dst地址,长度为32位宽字段和下一个标头类型。 通话代码: uint32_t payloadlen = htonl(32); struct ip6_hdr *ip6; struct nd_neighbor_advert *na; size_t len, offset, tmplen; uint8_t *tmppacket, icmp = 58; uint8_t packet[] = { 0x60, 0x00, 0x00, 0x00, 0x00, 0x20, 0x3A, 0xFF, 0x20, 0x01, 0x0D, 0xB8, 0xDD, 0xDD, 0x00, […]

C编程TCP校验和

我几天来一直无法为TCP做校验和。 我在互联网上查看了很多来源,但我见过的所有例子都没有向您展示如何进行TCP校验和。 我也查看了RFC文档但仍遇到问题: 下面是我用来生成校验和的代码: unsigned short checksum(unsigned short * buffer, int bytes) { unsigned long sum = 0; unsigned short answer = 0; int i = bytes; while(i>0) { sum+=*buffer; buffer+=1; i-=2; } sum = (sum >> 16) + (sum & htonl(0x0000ffff)); sum += (sum >> 16); return ~sum; } 此function适用于IP校验和。 下面是我为TCP标头制作的结构: struct tcp_header { […]