1 TCP校验文档校验文档要求:
校验码描述 校验码计算范围包含包头标识、消息头和消息体,校验算法采用 TCP 和校验,具体规则如下。
- 将待校验的所有数据分为 16 位的字(大端序),如果总长度为奇数个字节,则在最后增添一个 位都为 0 的字节;
- 将所有 16 位的字进行累加,累加结果大于 16 位时把进位一起加到低 16 位的校验和中;
- 对计算的检验和取反,作为最后的校验结果,大端序输出;
官方文档带有示例数据,如下图:
这是我们开发中经常用到用累加,取反作校验数据完整性,下面用java代码实现
java代码实现海康充电桩报文校验TCP的校验,代码如下:
/*** @author hua* @date 2022/11/13 21:39*/
public class mainTest {/*** 海康充电桩报文校验TCP校验和.* @param data 待校验的数据字节数组* @return 计算出的16位校验和*/public static short calculateTcpChecksumByHK(byte[] data) {int sum = 0;// 如果数据长度为奇数,添加一个0字节if (data.length % 2 > 0) {byte[] paddedData = new byte[data.length + 1];System.arraycopy(data, 0, paddedData, 0, data.length);data = paddedData;}// 将所有16位的字进行累加for (int i = 0; i < data.length; i += 2) {int word = ((data[i] << 8) & 0xFF00) + (data[i + 1] & 0xFF);sum += word;// 处理可能的进位while (sum > 0xFFFF) {sum = (sum & 0xFFFF) + (sum >> 16);}}// 取反并转换为short类型return (short) ~sum;}public static void main(String[] args) {byte[] data = {(byte)0x7d, (byte)0x7b, (byte)0x01, (byte)0x00,(byte)0x00, (byte)0x80, (byte)0xdd, (byte)0x00,(byte)0x04, (byte)0x04, (byte)0x01, (byte)0x02, (byte)0x00};short checksum = calculateTcpChecksumByHK(data);System.out.println("Checksum: " + String.format("%04X", checksum));}
下面用以上官方文档数据进行测试,输出结果9efd 与官方文档的测试结果一致如下图: