目錄區(qū)(Directory)包含字段區(qū)標(biāo)識(shí)字段变勇、長(zhǎng)度字段摘悴、定位字段信息的目錄,并以字段終止符為結(jié)束標(biāo)志。各字段位置是相對(duì)于字段區(qū)的纲仍,即字段區(qū)的首字段位置為0阱飘。字段區(qū)信息由頭標(biāo)區(qū)的入口圖驹吮,即第21依疼、22、24這三個(gè)字節(jié)決定的材鹦。
新建一個(gè)S57DirectoryItem
存儲(chǔ)以上三字段的信息:
public class S57DirectoryItem
{
public S57DirectoryItem(string tag, int fieldLength, int fieldPosition)
{
Tag = tag;
FieldLength = fieldLength;
FieldPosition = fieldPosition;
}
public string Tag;
public int FieldLength;
public int FieldPosition;
}
如US4AK7IM.000文件中逝淹,DDR頭標(biāo)區(qū)入口圖信息為:標(biāo)識(shí)字段為4字節(jié),長(zhǎng)度字段為3字節(jié)侠姑,定位字段為4字節(jié)创橄。通過(guò)hexdump
查看目錄區(qū)前三個(gè)目錄的信息分別為[(0000, 123, 0), (0001, 47, 123), (DSID, 165, 170)],如下圖:
目錄區(qū)
將前文解析得頭標(biāo)區(qū)信息中的入口圖代入莽红,即可依次解析目錄區(qū):
public class S57Directory
{
//第一個(gè)Item的Tag為0000妥畏,對(duì)應(yīng)Field Control Field (樹(shù)狀Tag對(duì))
public S57DirectoryItem[] Items;
public S57Directory(S57DDRLeader leader)
{
// 24 為頭標(biāo)區(qū)的長(zhǎng)度
var len = (leader.FieldAreaBaseAddress - 24) / leader.EntryMapWidth;
Items = new S57DirectoryItem[len];
for (int i = 0; i < len; i++)
{
Items[i] = new S57DirectoryItem(
BytesHelper.GetString(leader.FieldTagSize),
BytesHelper.GetInteger(leader.FieldLengthSize),
BytesHelper.GetInteger(leader.FieldPositionSize)
);
}
BytesHelper.Position++; //最后一個(gè)是分隔符
}
}
檢測(cè)工作是否正常:
var dir = new S57Directory(dl);
foreach (var di in dir.Items)
{
Console.WriteLine($"{di.Tag}\t{di.FieldLength}\t{di.FieldLength}");
}
解析結(jié)果顯示,程序運(yùn)行正常安吁,本文件DDR目錄一共包含16項(xiàng)醉蚁。
目錄區(qū)解析結(jié)果
- 標(biāo)簽
0000
是DDR所特有的,保存的是字段區(qū)各字段間的樹(shù)狀信息鬼店; - 標(biāo)簽
0001
是被S-57文件強(qiáng)制要求攜帶的网棍,表征該文件滿(mǎn)足ISO/IEC 8211編碼格式。 - 剩余的標(biāo)簽都是由四字母構(gòu)成妇智,表示不同的含義滥玷。各標(biāo)簽具體的含義詳見(jiàn)S-57標(biāo)準(zhǔn)。
各標(biāo)簽表達(dá)字段及其子字段名稱(chēng)及具體含義巍棱、取值范圍見(jiàn)下文惑畴。