2015-05-06 54 views
1

我有一个二进制数据blob作为一个字符串(十六进制),它不是来自数据库,我想获得它的文本表示。读取blob格式

String b = "00000000000000000000000008004500003c65c34000400651acc0a800fec0a800fedb620ceaccd8bb4d00000000a0028018ba5100000204400c0402080a00f0de8e0000000001030306"; 

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
for(int i = 0; i < b.length(); i+=2) { 
    baos.write(Integer.parseInt(b.substring(i, i + 2), 16)); 
} 

byte[] bytes = baos.toByteArray(); 
String blobString = new String(bytes); 
System.out.println(blobString); 

,但在运行它时,我得到:

�������������ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����ގ����E��ގ����ގ����<e�@�@Q����������b��ػM�������Q��@ 
��ގގ����ގ����ގ����ގ����ގ����ގ�������� 

我知道它应该输出的东西可读,所以我可能做错事。 如何将我的二进制数据转换为可读的字符串?


我想读这(我分开的部分,使其明确):

/* Header */ 

d4c3 b2a1 0200 0400 0000 0000 0000 0000 
ffff 0000 0100 0000 

======================================= 
/*First packet*/ 
/*Header*/ 
c1f9 7e48 //timestamp seconds 
e913 0200 //timestamp offset microseconds 
4a00 0000 //number of octet saved in file 
4a00 0000 //actual length of packet = 74 bytes 
/*Packet data*/ 
0000 0000 0000 0000 
0000 0000 0800 4500 003c 65c3 4000 4006 
51ac c0a8 00fe c0a8 00fe db62 0cea ccd8 
bb4d 0000 0000 a002 8018 ba51 0000 0204 
400c 0402 080a 00f0 de8e 0000 0000 0103 
0306 

当运行到tcpdump的,我得到这样的输出:

2008-07-17 09:50:25.136169 IP 192.168.0.254.56162 > 192.168.0.254.mysql: Flags [S], seq 3436755789, win 32792, options [mss 16396,sackOK,TS val 15785614 ecr 0,nop,wscale 6], length 0 
+1

它不可读,那里有很多0字节和非ASCII字节值。它是某种形式的二进制文件,绝对不是文本。你的代码看起来或多或少(它应该指定一种编码,但在这种情况下没有:)如果你想告诉我们关于blob起源的一些信息,我们可能会帮助更多。 – eckes

+0

@eckes它来自pcap文件捕获。它是第一个数据包标题之后的数据包数据。当使用tcpdump运行pcap文件时,我可以在终端中看到IP和其他内容,并且我知道它对应于此行。文档https://wiki.wireshark.org/Development/LibpcapFileFormat告诉数据是'incl_len'字节的数据blob,但我无法得到正确的表示。 – user2336315

+2

这绝对不是UTF-8(由前面的许多零来判断) –

回答

1

如果这是PCAP转储的一部分,您需要解析它是一个网络数据包。或者将它写成原始字节并使用其中一个可用的网络分析器。看看字符串,我期望45IPv4 header的开始,那么06将是协议字段(在这种情况下是TCP)。 c0a800fe(192.168.0.254)是源IP和目标IP。等等,你明白了。

它似乎是一个TCP SYN数据包(第一个新连接),因此它不包含任何有效负载。

--link-- 
000000000000 // src mac 
000000000000 // dst mac 
    0800 // ether type: IP 
--ipv4-- 
4500003c // v4 5*32bit length 
65c34000 // ID FLG OFF 
400651ac // TTL PROT(6=tcp) CHECK 
c0a800fe // ip.src 
c0a800fe // ip.dst 
---tcp--- 
db620cea // src.port 56162 -> dst.port 3306 
ccd8bb4d // tcp.seq (=3436755789) 
00000000 // tcp.ack 
a0028018 // off 0x02=URG/ACK/PSH/RST/SYN(1)/FIN(0) 
... 
+0

我很笨,我想我需要睡觉。但是,我猜这是要走的路。非常感谢 – user2336315

+0

链接字段对应什么? – user2336315

+0

由此我的意思是你怎么知道链接字段之前停止45(所以它的长度)?任何数据包都是任意的吗? – user2336315

0

试试这个:

String blobString = new String(bytes, "UTF-8");