2017-01-24 15 views
2

ペイロードの最後にuint16を追加した後、受信者にuint16を追加してcのuint16に戻しても構いません。C:uint16_tを送信者のペイロードに追加して受信者に再度返すようにする

uint16はcmpIdです。 送信者がこの行います

 const UInt8* data = getArray(byteArray); 
     data_length = getLenArray(byteArray) 
     data_length = data_length + 2; 
     UInt8 formatted_data[data_length]; 

     //serialize cmpid 
     formatted_data[data_length-2] = cmpId & 0xff; 
     formatted_data[data_length-1] = cmpId >> 8; 

をし、受信機がこれを行う:

 UInt8 len = (UInt8) ((smip_receive_t *) data)->payloadLen; 
     UInt8 * payload = (UInt8 *) ((smip_receive_t *) data)->payload; 

     UInt16 cmpid; 
     cmpid = (payload[len-2] << 8) | payload[len-1]; 

しかしcmpIdが正しくて来ません。私は間違って何をしていますか?

+1

注:固定サイズのタイプのための自作の名前を使用しないでください。あなたのタイトルには標準タイプが含まれていますが、あなたのコードでは未知の名前が使用されています。 – Olaf

答えて

2

で:

formatted_data[data_length-2] = cmpId & 0xff; 
formatted_data[data_length-1] = cmpId >> 8; 

あなたは使用する必要があります。

cmpid = (payload[len-1] << 8) | payload[len-2]; 

ない:

cmpid = (payload[len-2] << 8) | payload[len-1]; 
+1

@PaulR:OPは 'memcpy'を使わないので、各側のエンディアンは関係ありません!各側のコンパイラは、それが指定されたHWアーキテクチャに従ってビット単位の動作を実装する。 –

+0

D'oh - あなたはもちろんそうです - 私は私のコメントを削除します... –

+1

@PaulR:そのコメントをする直前に、私はOPに自分のコメントを書こうとしていました。 "ここでは' memcpy'を使わない方が良いでしょう。これはあなたのコードをプラットフォームに依存させるでしょう "。 –

関連する問題