char* pUint16 = (char*)&u16;
つまり、uint16_tのアドレスをキャストします。
char c16[2];
uint16_t ui16 = 0xdead;
memcpy( c16, ui16, 2 );
c16には、u16の2バイトが含まれるようになりました。遠端では、プロセスを逆にするだけです。
char* pC16 = /*blah*/
uint16_t ui16;
memcpy( &ui16, pC16, 2 );
興味深いことに、memcpyの呼び出しがありますが、サイズが固定されているため、ほぼすべてのコンパイラがそれを最適化します。
Steven sudtが指摘しているように、ビッグエンディアンの問題が発生する可能性があります。これを回避するには、htons(host-to-network short)関数を使用できます。
uint16_t ui16correct = htons( 0xdead );
遠端ではntohs(ネットワークからホストへのショート)を使用します
uint16_t ui16correct = ntohs( ui16 );
リトルエンディアンのマシンでは、これによりショートがビッグエンディアンに変換され、遠端でビッグエンディアンから変換されます。ビッグエンディアンのマシンでは、2つの関数は何もしません。
もちろん、ネットワーク上の両方のマシンのアーキテクチャが同じエンディアンを使用していることがわかっている場合は、この手順を回避できます。
32ビット整数を処理するためにntohlとhtonlを検索します。ほとんどのプラットフォームは、64ビットのntohllとhtonllもサポートしています。