G2Packet* G2Packet::New(char* pSource) { G2Packet* pPacket = New(); char nInput = *pSource++; char nLenLen = ( nInput & 0xC0 ) >> 6; char nTypeLen = ( nInput & 0x38 ) >> 3; char nFlags = ( nInput & 0x07 ); pPacket->m_bCompound = ( nFlags & G2_FLAG_COMPOUND ) ? true : false; bool bBigEndian = ( nFlags & G2_FLAG_BIG_ENDIAN ) ? true : false; quint32 nLength = 0; if ( bBigEndian ) { throw packet_error(); } else { char* pLenOut = (char*)&nLength; while ( nLenLen-- ) *pLenOut++ = *pSource++; } nTypeLen++; char* pszType = pPacket->m_sType; for ( ; nTypeLen-- ; ) { *pszType++ = *pSource++; } *pszType++ = 0; pPacket->Write( pSource, nLength ); return pPacket; }