Diferencia entre memcpy y copia por asignación

Struct A
{
   uint16_t len;
   uint8_t  cnt;
   uint8_t  unit;
   uint32_t seq; 
};

Esta estructura A se serializa en unchar * buf. Si quiero deserializar los valores individuales, por ejemplo:

uint16_t len = 0;
memcpy(&len, buf, sizeof(len));

o solo puedo hacer

uint16_t len = (uint16_t) buf;

¿Cuál es mejor o son los dos iguales?

También para deserializar toda la estructura, si solo hago

A tmp;

memcpy(&tmp, buf, sizeof(A));

¿Funcionaría bien o debería estar preocupado por el relleno, etc. del compilador?

Respuestas a la pregunta(1)

Su respuesta a la pregunta