Files
DragonTCP/android/src/tech/xvanturing/freeproxy/vpn/net/Checksum.kt
T
2026-08-16 03:48:57 -03:00

33 lines
1.2 KiB
Kotlin

package tech.xvanturing.freeproxy.vpn.net
/** RFC 1071 定义的 16 位反码和。 */
object Checksum {
/** 对 [length] 字节做反码求和,[initial] 用于把伪头部的和接续进来。 */
fun compute(data: ByteArray, offset: Int, length: Int, initial: Long = 0L): Int {
var sum = initial
var index = offset
val end = offset + length
while (index + 1 < end) {
sum += data.u16(index)
index += 2
}
// 奇数长度时最后一字节按高位对齐补零
if (index < end) sum += data.u8(index) shl 8
while ((sum ushr 16) != 0L) sum = (sum and 0xFFFF) + (sum ushr 16)
return (sum.inv() and 0xFFFF).toInt()
}
/** TCP/UDP 校验和覆盖的伪头部:源地址、目的地址、协议号与传输层长度。 */
fun pseudoHeaderSum(sourceIp: Int, destIp: Int, protocol: Int, transportLength: Int): Long {
var sum = 0L
sum += ((sourceIp ushr 16) and 0xFFFF).toLong()
sum += (sourceIp and 0xFFFF).toLong()
sum += ((destIp ushr 16) and 0xFFFF).toLong()
sum += (destIp and 0xFFFF).toLong()
sum += protocol.toLong()
sum += transportLength.toLong()
return sum
}
}