github.com/vmware/govmomi@v0.51.0/toolbox/hgfs/encoding.go (about) 1 // © Broadcom. All Rights Reserved. 2 // The term “Broadcom” refers to Broadcom Inc. and/or its subsidiaries. 3 // SPDX-License-Identifier: Apache-2.0 4 5 package hgfs 6 7 import ( 8 "bytes" 9 "encoding" 10 "encoding/binary" 11 ) 12 13 // MarshalBinary is a wrapper around binary.Write 14 func MarshalBinary(fields ...any) ([]byte, error) { 15 buf := new(bytes.Buffer) 16 17 for _, p := range fields { 18 switch m := p.(type) { 19 case encoding.BinaryMarshaler: 20 data, err := m.MarshalBinary() 21 if err != nil { 22 return nil, ProtocolError(err) 23 } 24 25 _, _ = buf.Write(data) 26 case []byte: 27 _, _ = buf.Write(m) 28 case string: 29 _, _ = buf.WriteString(m) 30 default: 31 err := binary.Write(buf, binary.LittleEndian, p) 32 if err != nil { 33 return nil, ProtocolError(err) 34 } 35 } 36 } 37 38 return buf.Bytes(), nil 39 } 40 41 // UnmarshalBinary is a wrapper around binary.Read 42 func UnmarshalBinary(data []byte, fields ...any) error { 43 buf := bytes.NewBuffer(data) 44 45 for _, p := range fields { 46 switch m := p.(type) { 47 case encoding.BinaryUnmarshaler: 48 return m.UnmarshalBinary(buf.Bytes()) 49 case *[]byte: 50 *m = buf.Bytes() 51 return nil 52 default: 53 err := binary.Read(buf, binary.LittleEndian, p) 54 if err != nil { 55 return ProtocolError(err) 56 } 57 } 58 } 59 60 return nil 61 }