我正在从pcap数据包中捕获数据;在我的代码中我有一个byte []数据,我想使用新的String()构造函数解码为String。
我的代码如下:
byte[] data = payload.getByteArray(0, payload.size()); //jnetpcap, return a byte[] data
String datastr = new String(data);
Log.i("DNS PAYLOAD", datastr);
但结果却抛出:
DNS PAYLOAD: apisecmiuicom
相反:
DNS PAYLOAD:api.sec.miui.com
我需要替换所有未知的“ ”字符,并获得上面的链接。任何消化?
PD:使用Array.toString(数据),抛出:
[ - 32,-51,1,0,0,1,0,0,0,0,0,3,97,112,105,3,115,101,99,4,109, 105,117,105,3,99,111,109,0,0,28,0,1]
PD2:有效负载字符串数据(payload.toString())如下所示:
Data: ******* Payload offset=42 (0x2A) length=107
Data:
002a: ab 7f 81 80 00 01 00 00 00 01 00 00 02 65 31 08 .............e1.
003a: 77 68 61 74 73 61 70 70 03 6e 65 74 00 00 1c 00 whatsapp.net....
004a: 01 c0 0f 00 06 00 01 00 00 00 e2 00 3e 03 6e 73 ............>.ns
005a: 31 03 70 31 33 06 64 79 6e 65 63 74 c0 18 0a 68 1.p13.dynect...h
006a: 6f 73 74 6d 61 73 74 65 72 08 77 68 61 74 73 61 ostmaster.whatsa
007a: 70 70 03 63 6f 6d 00 78 3a 61 3e 00 00 0e 10 00 pp.com.x:a>.....
008a: 00 02 58 00 09 3a 80 00 00 07 08 ..X..:.....
它是从传输协议UDP,端口53中提取的。
答案 0 :(得分:1)
可以做一个String.replace,但更正确:
int n = 0;
for (byte b : data) {
if (32 <= b && b < 127) { // Within ASCII
data[n++] = b;
}
}
String datastr = new String(data, 0, n, StandardCharsets.US_ASCII);