func (n *krNodesIPv6) UnmarshalBencode(b []byte) error { var bb []byte err := bencode.DecodeBytes(b, &bb) if err != nil { return err } if len(bb)%38 != 0 { return fmt.Errorf("not divisible by 38") } *n = nil for len(bb) > 0 { nodeID := NodeID(bb[0:20]) ip := net.IP(bb[20:36]) port := binary.BigEndian.Uint16(bb[36:38]) *n = append(*n, NodeLocator{ NodeID: nodeID, Addr: net.UDPAddr{ IP: ip, Port: int(port), }, }) bb = bb[38:] } return nil }
func decodeByType(b bencode.RawMessage, valueType reflect.Type) (interface{}, error) { if valueType != nil { v := reflect.New(valueType).Interface() err := bencode.DecodeBytes([]byte(b), v) if err != nil { return nil, err } return v, nil } var generic interface{} err := bencode.DecodeBytes([]byte(b), &generic) if err != nil { return nil, err } return generic, nil }
func Decode(b []byte) (msg *Message, err error) { err = bencode.DecodeBytes(b, &msg) if err != nil { log.Debugf("decode error: %x", b) return } if msg.Type == "q" { msg.Args, err = decodeByType(msg.Args_, queryTypes[msg.Method]) } // msg.Type == "r": Must decode later using ResponseAsMethod. return }
func (n *Endpoint) UnmarshalBencode(b []byte) error { var bb []byte err := bencode.DecodeBytes(b, &bb) if err != nil { return err } if len(bb) != 6 && len(bb) != 18 { return fmt.Errorf("endpoint not 6 or 18 bytes in length") } ip := net.IP(bb[0 : len(bb)-2]) port := binary.BigEndian.Uint16(bb[len(bb)-2:]) *n = Endpoint{ IP: ip, Port: int(port), } return nil }