V7
This commit is contained in:
@@ -0,0 +1,32 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user