2017-11-03 6 views
0

私はpcapパケットからデータをキャプチャしています。私のコードでは、byte []データがあり、新しいString()コンストラクタを使用してStringにデコードしたいと思います。byte []をドット付き配列に変換する正しい方法

byte[] data = payload.getByteArray(0, payload.size()); //jnetpcap, return a byte[] data 
String datastr = new String(data); 

Log.i("DNS PAYLOAD", datastr); 

しかし、結果はスロー::

私のコードは次のようである

DNSペイロード:apisecmiuicom代わりに

DNSペイロード:api.sec.miui.com

私はすべての未知数「」文字を置換し、上記のようなリンクを取得する必要があります。どんな服薬?

PD:Array.toString(データ)を用い、これをスロー:

[-32、-51、1、0、0、1、0、0、0、0、0、0、 0,0,28,0,1]

この発明と関係が強いastamuse(アスタミューゼ)は機能、素材、産業等様々な点から検索、比較・検討することが出来ます! 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

これは、文字列エンコーディングについての質問です。あなたの '新しいString(data)'は、あなたのJVMプラットフォーム(おそらくUTF-8)のデフォルトのエンコーディングとしてバイトを解釈します。これは明らかにここでは動作しません。これは、生パケットのどの部分を読み込もうとしているのか、そしてどのプロトコルがペイロードのエンコーディングを制御しているかによって、非常に恣意的である可能性があるので、より多くのコンテキストが必要です。 –

答えて

1

一つString.replaceを行うことができますが、より正しい: - http://kunststube.net/encoding/

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); 
+0

はい、すべての特殊なユニコードブロック "U + FFFD"( )を置き換えますが、ドットを消去してください。 "あまりにも。 「新しい文字列(data、0、n、Standarscharactersets.US_ASCII)」では2つのパラメータを使用できません。私はアンドロイドでプログラミングしているからです。 –

関連する問題