ネットワークプログラミング相談室 Port28

このエントリーをはてなブックマークに追加
732678
>>715,727(>>669)
(ネットワーク上を流れる)外部データ表現と(OS内部の)内部データ表現との違いを間違って理解している
XDR(eXternal Data presentation)は通信規格だから、
(一般的な)整数型は(OSの違いとは無関係に)32bit固定と明確に仕様が定義されている
(これはC言語上でのデータ型 short/int/long のどれであっても同じで、通信データとしては全て32bit)
そして、long型のOS内部表現では大きさが32bit/64bitとかエンディアンといった差異が
存在するから、それらを吸収させる為に xdr_xxx という変換関数がライブラリとして提供されている
だから「32ビットと64ビットで(通信データの)サイズが異なってしまう」なんてことはありえなくて、
普通は xdr_long を呼ぶコードには何ら修正を加えること無くリコンパイルするだけで終わる

以下は「Solaris 64 ビット開発ガイド」p.64 からの引用(題名でググればPDFで読める)
  XDR ルーチンの xdr_long(3NSL) は問題と思われるかもしれません。しかし、これは
  既存のプロトコルとの互換性を持たせるために従来どおり 32 ビットとして取り扱われます。
  64 ビットバージョンのルーチンが 32 ビットに格納できない long 値を
  コード化するように要求された場合、そのコード化処理は失敗します。