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  }