2011-07-09 27 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 
}