5

私はCで構造のパディングとパッキングを学んでいます.パディングはアーキテクチャに依存することを読んだので、この疑問があります.マシン間通信に影響しますか?あるマシンで作成されたデータが他のマシンで読み取られている場合。このシナリオでこの問題を回避する方法。

4

5 に答える 5

6

はい、プラットフォーム間で構造のバイナリ データを送信し、反対側で同じように見えることを期待することはできません。

それを解決する方法は、コンストラクト用のマーシャラー/デマーシャラーを作成し、それを一方のシステムから出る途中と、もう一方のシステムに入る途中で渡すことです。これにより、コンパイラは各システムでバッファリングを処理できます。

どちらの側も、指定したとおりにデータを取得し、ローカル プラットフォームで処理する方法を知っています。

Java などのプラットフォームは、クラスのシリアル化メカニズムを作成することでこれを処理します。C では、これを自分で行う必要があります。その方法は、データの送信方法によって異なります。バイナリ、XML、またはその他のものにシリアル化できます。

于 2013-05-07T02:35:00.350 に答える
2

#pragma pack私が知っているほとんどのコンパイラでサポートされています。これにより、プログラマーは構造体に必要なパディング方法を指定できます。

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

http://gcc.gnu.org/onlinedocs/gcc/Structure_002dPacking-Pragmas.html

http://clang.llvm.org/docs/UsersManual.html#microsoft-extensions

于 2013-05-07T02:33:40.340 に答える
0

他のアーキテクチャ用にコンパイルしたコードが異なるパディング スキームを使用している場合にのみ影響を受けます。

問題を軽減するために、パディングなしで構造をパックすることをお勧めします。パディングが必要な場合は、プレースホルダーを使用します (例: char reserved[2])。また、ビットフィールドを使用しないでください!! ポータブルではありません。

また、他のアーキテクチャ関連の問題にも注意する必要があります。具体的には、エンディアンとデータ型のサイズです。移植性を高める必要がある場合は、バイト ストリームをstruct.

于 2013-05-07T02:43:05.410 に答える
0

構造体宣言の前に #pragma pack(1) を使用し、前に #pragma pack() を使用して、アーキテクチャ ベースのパッキングを無効にすることができます。一部のデータ型もアーキテクチャに基づいているため、これで問題の半分が解決します。後半を解決するために、通常、16 ビット整数には int_16、32 ビット整数には u_int_32 などの特定のデータ型を使用します。

http://freebsd.active-venture.com/FreeBSD-srctree/newsrc/netinet/ip_icmp.h.htmlを見てください。これには、いくつかのアーキテクチャに依存しないネットワーク データ パケットが含まれます。

于 2013-05-07T23:42:59.470 に答える