2011-07-09 54 views
0

我有一個我爲iPhone編寫的移動應用程序(Objective-C),它允許用戶使用特定格式導入數據。我在Java中爲Android編寫了相同的應用程序,並且我有用戶開始要求導入的能力。數據格式是一個便攜式標準,編寫這種應用程序的人必須能夠導入和導出數據。如何解析Java中的這個TLV?

雖然我在Objective-C中編寫了要提問的內容,但我感覺我可以通過不同的方式讓自己的生活變得更輕鬆。所以,我想問你如何解析Java中的以下TLV。我不需要代碼,只是要點。

這裏的TLV格式:

<Type:Length>Value<Type:Length>Value<Type:Length>Value<end> 

每條記錄​​<開始,以<end>結束。 \記錄內是可以接受的,零長度值是可以的。

下面是描述四種不同汽車的示例輸入,請注意多行記錄和零長度值。

<make:4>ford<model:7>contour<color:3>red<end> 
<make:5>mazda<model:3>mpv<color:5>black<end> 
<make:3>bmw 
<model:3>335 
<color:6>yellow 
<end> 
<make:7>unknown<model:0><color:4>grey<end> 

一旦數據被解析,我將其插入一個SQLite數據庫,以便最終通過循環每條記錄的數據將導致一堆,我可以作爲INSERT語句的一部分使用的字符串。

感謝您提供任何想法!

尼克

+0

爲什麼不在codereview stack exchange上發佈代碼,以便人們可以評論/建議改進? – Mat

+0

這是個好主意,Mat。我不知道這是可用的,我會檢查出來。我在下面對Will的評論回覆中給出了我現在的做法。 – Stateful

+0

你能幫我一下如何使用目標C的TLV格式嗎?你能否給我一些示例代碼示例? – DShah

回答

1

非常奇怪的格式。是否有已發佈的規範?

您可以嘗試執行字符串標記化路由。你可以利用內置的Java正則表達式來幫助匹配,甚至只需使用基本的類方法(分割和修剪成爲你的朋友)。基本上只是做:

String[] lines = input.split("<end>"); 
for(String line : lines) 
{ 
    line = line.trim(); 
    String[] sublines = line.split("<"); 
    for(String subline : sublines) 
    { 
     subline = subline.trim(); 
     ...additional breaking, trimming, branching... 
    } 
} 

類型長度是一個有趣的驗證組件,但對於一個現代化的語言有點古怪。我會問的一個大問題就是編碼的期望。 UTF-8? 7位ASCII碼?奇怪的東西?

我的朋友會打電話給破解上面的僞代碼,並告訴我做一些像JavaCC,但我有書呆子和不切實際的朋友。 ;)

+0

你好,這是我所想的。目前在iPhone應用程序中,我將按char字符排序,如果它是'<'char char字符轉換爲臨時字符串,直到我點擊一個:,將該類型與我的應用程序關心的可能類型進行比較,如果需要,基於迭代該char指針索引的值。這是非常手動的。這是規範:http://www.adif.org/adif227.htm – Stateful

0

如果輸入的文件是不會太大,你可以閱讀這一切爲String然後將字符串分割成基於<end>作爲分隔符的數組。然後使用正則表達式遍歷數組以捕獲每個Type和相應的Value

0

格式的xmlishness有點混亂。長度是令牌的長度嗎?我想我會用下面的算法:

next_record: 
while (! eof) { 
    read token between '<' and '>' 
    if (token == "end") { 
    continue next_record 
    } 
    split token into type and length 
    read length number of characters into value 
    add tuplee (type, length, value) to collection 
}