2012-01-30 12 views
0

を受信すると、データ、バイト順と整列「をシリアライズ」:reinterpret_castは、我々はPODが構造言う持っている、と私はこれを行う場合は、エンド

char* ptr = reinterpret_cast<char*>(A); 
char buf[20]; 
for (int i =0;i<20; ++i) 
    buf[i] = ptr[i]; 
network_send(buf,..); 

recievingは、リモートボックスを終了すると、必ずしも同一のハードウェアではありませんがまたはOSは、私が無事に「アンシリアライズ」にこれを行うことができます。

void onRecieve(..char* buf,..) { 
    A* result = reinterpret_cast<A*>(buf); // given same bytes in same order from the sending end 

は「結果」は常に有効になりますか? C++標準ではPOD構造で状態を示しますが、reinterpret_castの結果は最初のメンバーを指すはずですが、受信側が別のプラットフォームであっても実際のバイトオーダーが正しいことを意味しますか?

+1

ためtemplateforこれを使用し、コンパイラがそれを処理させることを検討していいえ、それは常に有効ではありません。 1つのプラットフォームがビッグエンディアンで、もう1つがリトルエンディアンである場合を考えてみましょう。 [ネットワークバイトオーダー](http://en.wikipedia.org/wiki/Endianness#Endianness_in_networking)は、この非常に問題から生じました... – Cameron

+0

埋め込みもプラットフォームによって異なる可能性があります – bdonlan

答えて

1

いいえ、できません。あなたは今まで決してバックオブジェクトポインタに、char*に「ダウン」キャストすることができます:コードで

Source     Destination 
    \      /
     \      /
     V      V 
read as char* ---> write as if to char* 

Foo Source; 
Foo Destination; 

char buf[sizeof(Foo)]; 

// Serialize: 
char const * ps = reinterpret_cast<char const *>(&Source); 
std::copy(ps, ps + sizeof(Foo), buf); 

// Deserialize: 
char * pd = reinterpret_cast<char *>(&Destination); 
std::copy(buf, buf + sizeof(Foo), pd); 

一言で言えば:あなたがオブジェクトをたい場合は、あなたがする必要がありますオブジェクトです。ランダムなメモリ位置をふりまとめることはできませんは実際にはそうでない場合(つまり、目的のタイプの実際のオブジェクトのアドレスでない場合)、オブジェクトであるです。

+0

申し訳ありません、私は餌を取るでしょう... *なぜなら、プラットフォームが同じで、ソースバイトが同じタイプの有効な(POD)オブジェクトから来ていると仮定して、ランダムなメモリ位置をオブジェクトと見なすことができないのはなぜですか?あなたの方法のために+1。存在する場合、整列の問題も処理されます。 – Cameron

+0

@Cameronの場合、OPはプラットホームが必ずしも同じではないかどうかを尋ねています – bdonlan

+0

@bdonlan:そうですが、Kerrekはそれがそうではない(あるいはむしろやってはならない)と言っているようです同じプラットフォーム。 – Cameron

0

あなたは

template<typename T> 
struct base_type { 
    union { 
     T scalar; 
     char bytes[sizeof(T)]; 
    }; 
    void serialize(T val, byte* dest) { 
     scalar = val; 
     if is_big_endian { /* swap bytes and write */ } 
     else { /* just write */ } 
    } 
}; 
関連する問題