golang &0xffff作用

xid := os.Getpid()&0xffff
有人知道这里&0xffff起什么作用吗?

我在许大的《go语言编程》第5章看到的icmp的例子

不知道这几句是什么意思,起什么作用的


sum = (sum >> 16) + (sum & 0xffff)
sum += (sum >> 16)
var answer uint16 = uint16(^sum)


原方法

    func checkSum(msg []byte) uint16 {
       sum := 0
     for n := 1; n < len(msg)-1; n += 2 {
        sum += int(msg[n])*256 + int(msg[n+1])
    }
    sum = (sum >> 16) + (sum & 0xffff) 
    sum += (sum >> 16)
    var answer uint16 = uint16(^sum)
    return answer
}
阅读 12.1k
2 个回答

PID一般是16位(也可以改 pid_max),os.Getpid()&0xffff 只取Pid低16位。

RAW Socket Packet在header中需要一个唯一ID,通常就用当前进程的PID,但这个id要求是unsigned short(16 bit),所以就取os.Getpid()&0xffff


后面一个checkSum函数是一种常见的 Internet checksum算法。

//就是将一个32位的数的高16位加上低16位
sum = (sum >> 16) + (sum & 0xffff) 
//再将结果的高16位加上自身
sum += (sum >> 16)
//因为tcp checksum数据大小也是16位,所以
var answer uint16 = uint16(^sum)

实际上,上面的代码和前面for循环将msg每一个byte相加是差不多一回事。相当于对sum这个int数据再进行一次简单的check sum。

其实更简单的写法是:

/* Fold to get the ones-complement result */
while (sum >> 16) sum = (sum & 0xFFFF)+(sum >> 16);

参考:

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题