Я бы ещё попробовал вынести определение типа "struct t_ARPlayer{" в более внешнюю область.
Хотя С++-компиляторы и должны поддерживать все современные извраты типа заключения определений типа в структуру и юзанья оттудова в шаблоне, зависящем от этой структуры, хорошо это сделают совсем немногие, а другие могут и треснуть внутри.
"(t_ARPlayer*)data+14", конечно, лучше изложить в редакции "(t_ARPlayer*)(data+14)" -- вряд ли подразумевается 14-я структура.
Ещё есть вариант с подменой оператора new на более свой -- мне наш Плюсолюб подсказал. Вдруг проканает через malloc() взятый кусок.
Память под объект может быть выделена любым методом, только нужно сварганить свои операторы new/delete (placement new) и вызывать их с дополнительным параметром (а обычный new останется -- просто так, без доп-параметра):
Код
void * operator new(size_t, void *ptr) {return ptr;}
void operator delete(void *, void * ptr) {}
eArp *p = (eArp*) malloc(sizeof(eArp));
new (p) eArp(buf); // call constructor with ready memory
(*p).~eArp(); // call destructor without delete()