3

PHP、fopen、fseek、pack などを使用してデータを作成し、ファイル (新しい「ESRI Shape ファイル」) に書き込みます。ファイルの仕様はhttp://www.esri.com/library/whitepapers/pdfs/です。 shapefile.pdf .

ファイル仕様には、書き込まれるデータは次の組み合わせである必要があると記載されています。

  • 整数: 符号付き 32 ビット整数 (4 バイト) - ビッグ エンディアン
  • 整数: 符号付き 32 ビット整数 (4 バイト) - リトル エンディアン
  • Double: 符号付き 64 ビット IEEE 倍精度浮動小数点数 (8 バイト) - リトル エンディアン

これらのフォーマットを可能にする pack() フォーマットが見つからないようです。このコードはさまざまなプラットフォームで実行される可能性があるため、マシンに依存する形式は使用したくありません。

これらの 3 つの形式にどの形式 (または形式の組み合わせ) を使用する必要があるかについて、誰でもアドバイスできますか?

どうもありがとう、スティーブ

4

2 に答える 2

5

PHP がサポートしていない場合は、独自に実装できます。

function pack_int32be($i) {
   if ($i < -2147483648 || $i > 2147483647) {
      die("Out of bounds");
   }
   return pack('C4',
      ($i >> 24) & 0xFF,
      ($i >> 16) & 0xFF,
      ($i >>  8) & 0xFF,
      ($i >>  0) & 0xFF
   );
}

function pack_int32le($i) {
   if ($i < -2147483648 || $i > 2147483647) {
      die("Out of bounds");
   }
   return pack('C4',
      ($i >>  0) & 0xFF,
      ($i >>  8) & 0xFF,
      ($i >> 16) & 0xFF,
      ($i >> 24) & 0xFF
   );
}

倍精度 LE ははるかに困難です。4 倍精度システムをサポートするには、 を使用して数値をパックdし、バイナリ文字列に変換し、バイナリをフィールドに分割し、フィールドが大きすぎる場合はフィールドを適切なサイズに切り捨て、フィールドを連結し、バイナリからバイトに変換する必要があります。

于 2013-04-16T15:40:07.180 に答える