バイナリ ファイルを読み取ってバイトを解析しようとしています。ファイルの解析方法を知るためにシェープファイルに関するホワイト ペーパー仕様を持っていますが、ColdFusion でバイトの読み取りを処理し、それらをどう処理するかを決定するための正しい関数を見つけることができないようです。 .
<cffile action="READBINARY"
file="mypath/www/_Dev/tl_2009_25_place.shp"
variable="infile" >
仕様を含む PDF ファイル: http://www.esri.com/library/whitepapers/pdfs/shapefile.pdf
たとえば、私は仕様を持っています:
位置 フィールド 値 タイプ 順序
バイト 0 ファイル コード 9994 整数 ビッグ
バイト 4 未使用 0 整数 ビッグ
バイト 8 未使用 0 整数 ビッグ
バイト 12 未使用 0 整数 ビッグ
バイト 16 未使用 0 整数 ビッグ
バイト 20 未使用 0 整数 ビッグ
バイト 24 ファイル長 ファイル長 整数 ビッグ
Byte 28 Version 1000 Integer Little
Byte 32 Shape Type Shape Type Integer Little
Byte 36 Bounding Box Xmin Double Little
Byte 44 Bounding Box Ymin Double Little
Byte 52 Bounding Box Xmax Double Little
Byte 60 Bounding Box Ymax Double Little
Byte 68* Bounding Box Zmin Double Little
バイト 76* バウンディング ボックス Zmax ダブル リトル
バイト 84* バウンディング ボックス Mmin ダブル リトル
バイト 92* バウンディング ボックス Mmax ダブル リトル
これが単なるフラット テキスト ファイルである場合は、mid 関数を使用して自分の位置を読み取ります。これは ColdFusion で実行できますか? また、どの関数が目標を達成できますか?
この関数は、Actionscript3 ファイルであるhttp://code.google.com/p/vanrijkom-flashlibs/wiki/SHPにあるFarStream.as 内で見つかりましたが、実行する必要があるタスクの種類を表しています。
private function readHeader(e: ProgressEvent): void {
// check header:
if (! ( readByte()==0x46
&& readByte()==0x41
&& readByte()==0x52
))
{
dispatchEvent(new IOErrorEvent
( IOErrorEvent.IO_ERROR
, false,false
, "File is not FAR formatted")
);
close();
return;
}
// version:
vMajor = readByte();
vMinor = readByte();
if (vMajor>VMAJOR) {
dispatchEvent(new IOErrorEvent
( IOErrorEvent.IO_ERROR
, false,false
, "Unsupported archive version (v."+vMajor+"."+vMinor+")")
);
close();
return;
}
// table size:
tableSize = readUnsignedInt();
// done processing header:
gotHeader= true;
}
そして、ここに最終的な解決策があります
<cfset shapeFile = createObject("java","com.bbn.openmap.layer.shape.ShapeFile").init('/www/_Dev/tl_2009_25_place.shp')>
<cfdump var="#shapeFile.getFileLength()#">