读取 blob 格式

Read blob format

我有一个字符串形式的二进制数据 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

试试这个:

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

如果这是 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)
...