将byte []转换为带点的数组的正确方法

时间:2017-11-03 03:11:27

标签: java string byte decode

我正在从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中提取的。

1 个答案:

答案 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);