code: func (c *ConfigArg) UnmarshalBinary(b []byte) error {
  	// Must contain minimum length for argument
  	if len(b) < configArgLen {
  		return io.ErrUnexpectedEOF
  	}
  
  	// Retrieve basic data
  	c.BufferCount = binary.BigEndian.Uint16(b[0:2])
  	c.FirmwareVersion = binary.BigEndian.Uint16(b[2:4])
  	c.SectorCount = b[4]
  
  	// Version is most significant 4 bits
  	c.Version = uint8(b[5] >> 4)
  
  	// Command is least significant 4 bits of byte 5
  	c.Command = ConfigCommand(b[5] & 0x0f)
  
  	// StringLength cannot be larger than the number of bytes remaining
  	// in the buffer
  	c.StringLength = binary.BigEndian.Uint16(b[6:8])
  	if len(b[8:]) < int(c.StringLength) {
  		return io.ErrUnexpectedEOF
  	}
  	// StringLength must not be greater than 1024, per AoEr11, Section 3.2.
  	if c.StringLength > 1024 {
  		return ErrorBadArgumentParameter
  	}
  
  	// Copy config string for use
  	d := make([]byte, c.StringLength)
  	copy(d, b[8:])
  	c.String = d
  
  	return nil
  }
docs: // UnmarshalBinary unmarshals a byte slice into a ConfigArg.
  //
  // If the byte slice does not contain enough data to form a valid ConfigArg,
  // or config string length is greater than the number of remaining bytes in b,
  // io.ErrUnexpectedEOF is returned.
  //
  // If config string length is greater than 1024, ErrorBadArgumentParameter is
  // returned.