package amf import ( "errors" "encoding/binary" "math" ) type AMFObj map[interface{}]interface{} func DecodeAMF(data *[]byte) (AMFObj, error) { var byte_idx uint32 var root_obj_idx uint8 amf_root_obj := make(AMFObj) for { top_level_obj, err := read_next(data, &byte_idx) if err != nil { return amf_root_obj, err } amf_root_obj[root_obj_idx] = top_level_obj root_obj_idx += 1 } return amf_root_obj, nil } func read_bytes(data *[]byte, byte_idx *uint32, n uint32) ([]byte, error) { if int(*byte_idx + n) > len(*data) { return make([]byte, 0), errors.New("Read goes past end") } *byte_idx += n return (*data)[*byte_idx:*byte_idx + n], nil } func read_number(data *[]byte, byte_idx *uint32) (float64, error) { float_bytes, err := read_bytes(data, byte_idx, 8) if err != nil { return 0.0, err } return math.Float64frombits(binary.BigEndian.Uint64(float_bytes)), nil } func read_next(data *[]byte, byte_idx *uint32) (interface{}, error) { data_type, err := read_bytes(data, byte_idx, 1) if err != nil { return nil, err } switch data_type[0] { case 0: next_obj, err := read_number(data, byte_idx) if err != nil { return nil, err } return next_obj, nil } return nil, errors.New("tmp") }