【问题标题】:Parsing a text file of network packets in Java用Java解析网络数据包的文本文件
【发布时间】:2013-02-14 13:59:11
【问题描述】:

我很难用 Java 解析这个 .dat 文件。我试图解析的 .dat 文件的格式如下所示。这些实际上是我正在研究的数据包生成器程序的数据包。每个数据包在每个块之间用新线划定。我希望数据包中的每个字节都存储在单个字节 [] 中。我一直在使用 BufferedReader readline() 方法逐行执行,但在存储整个数据包方面仍然收效甚微。提前感谢您提供的任何帮助。

00 04 75 8d 49 c7 00 01 03 cd 50 3c 08 00 45 00 
00 30 08 0d 40 00 80 06 00 00 c0 a8 ec 20 c0 a8 
ec 1e 04 16 00 50 b8 63 45 fd 00 00 00 00 70 02 
fa f0 2b d7 00 00 02 04 05 b4 01 01 04 02 

00 01 03 cd 50 3c 00 01 03 dd 4c 2d 08 00 45 00 
00 30 00 00 40 00 40 06 e1 37 c0 a8 ec 1e c0 a8 
ec 20 00 50 04 16 e9 bb 68 bf b8 63 45 fe 70 12 
16 d0 bd 6b 00 00 02 04 05 b4 01 01 04 02 

00 04 75 8d 49 c7 00 01 03 cd 50 3c 08 00 45 00 
00 28 08 0f 40 00 80 06 00 00 c0 a8 ec 20 c0 a8 
ec 1e 04 16 00 50 b8 63 45 fe e9 bb 68 c0 50 10 
fa f0 59 ab 00 00 

00 04 75 8d 49 c7 00 01 03 cd 50 3c 08 00 45 00 
00 ed 08 10 40 00 80 06 00 00 c0 a8 ec 20 c0 a8 
ec 1e 04 16 00 50 b8 63 45 fe e9 bb 68 c0 50 18 
fa f0 5a 70 00 00 47 45 54 20 2f 20 48 54 54 50 
2f 31 2e 31 0d 0a 41 63 63 65 70 74 3a 20 2a 2f 
2a 0d 0a 41 63 63 65 70 74 2d 4c 61 6e 67 75 61 
67 65 3a 20 65 6e 2d 75 73 0d 0a 41 63 63 65 70 
74 2d 45 6e 63 6f 64 69 6e 67 3a 20 67 7a 69 70 
2c 20 64 65 66 6c 61 74 65 0d 0a 55 73 65 72 2d 
41 67 65 6e 74 3a 20 4d 6f 7a 69 6c 6c 61 2f 34 
2e 30 20 28 63 6f 6d 70 61 74 69 62 6c 65 3b 20 
4d 53 49 45 20 36 2e 30 3b 20 57 69 6e 64 6f 77 
73 20 4e 54 20 35 2e 30 29 0d 0a 48 6f 73 74 3a 
20 31 39 32 2e 31 36 38 2e 32 33 36 2e 33 30 0d 
0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 4b 65 65 
70 2d 41 6c 69 76 65 0d 0a 0d 0a 

【问题讨论】:

  • 您的意思是,例如 arr[0] 中的 00、arr[1] 中的 04、arr[2] 中的 75,就像它在 arr[n] 中以 0a 一样进入文件末尾跨度>
  • 发布您的实际代码,并定义“收效甚微”。

标签: java arrays parsing network-programming packet


【解决方案1】:

一个数组是固定长度的,你似乎不知道你将拥有多少字节,直到你遇到一个空白行,你不知道你将拥有多少个数据包。

我建议使用ArrayList<ArrayList<Byte>> 来保存所有数据包 - 这将根据需要增长。

创建一个初始的ArrayList<Byte> 然后就是一个简单的循环:

  • 虽然readline() 不为空
  • 检查空行
  • 如果不是空白
    • 使用String.split()String解析成String[]
    • 遍历String[]并将每个十六进制对转换为byte并添加到ArrayList<Btye>
  • 如果为空
    • ArrayList<Byte> 添加到ArrayList<ArrayList<Byte>>
    • 新建ArrayList<Byte>

readline() 返回null 时,循环退出并且您的ArrayList<ArrayList<Byte>> 包含所有数据包。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多