Afficher les packet (java)

Bonjour,

j'ai voulu afficher le corps d'un paquet avec la bib "jpcap" (Java), mais le resultat obtenu est incompréhensible, j'ai voulu le traduire en binaire ( ou chaine de caractere)

Code:
package sn;

import jpcap.PacketReceiver;
import jpcap.packet.Packet;

/**
*
* @author Ruchira
*/
public class PacketPrinter implements PacketReceiver{
private String str;
StringBuffer sb = new StringBuffer();

public void receivePacket(Packet p) {
System.out.println("Paket :"+p.data.toString());
int i=0;
String ch=new String();
ch = Integer.toString(i);
//============= je l'ai trouvé dans l'internet
byte[] bytes=new byte[p.header.length + p.data.length];
System.arraycopy(p.header, 0, bytes, 0, p.header.length);
System.arraycopy(p.data, 0, bytes, p.header.length, p.data.length);

StringBuffer buffer = new StringBuffer();
for(i=0;i<bytes.length;){
for(int j=0;j<8 && i<bytes.length;j++,i++){
String d = Integer.toHexString((int)bytes[i]&0xff);
buffer.append((d.length()==1?"0"+d:d)+" ");
if(bytes[i]<32 || bytes[i]>126){
bytes[i]=46;
}
}
}

str=buffer.toString();
StringBuffer textArea = new StringBuffer();
textArea.append(str);
for(i=0;i<str.length()-1;i+=2){
String output=str.substring(i, (i+2));
int decimal=Integer.parseInt(output, 16);
sb.append((char)decimal);
}
str=sb.toString();
System.out.println("Paket' :"+str);
//=================================================
}
}
//=====================================================

le resultat:

Paket :[B@12d15a9
Paket :[B@e91f5d
Paket :[B@10a3b24
Paket :[B@b0ce8f
Paket :[B@1c92535

2 réponses

  • Votes
  • Date
  • Date décroissante
  1. Modérateur
    Ton problème vient de p.data.toString() qui ne donne pas ce que tu veux. En effet ce que tu obtiens correspond à la méthode toString de la classe Object, car elle n'est pas redéfini pour les tableaux ("[B" correspond au nom de la classe des byte[]).
    Le mieux pour ton affichage serait d'utiliser le constructeur String(byte[]) :

    System.out.println("Paket : "+new String(p.data));
    La confiance n'exclut pas le contrôle
    1. Merci KX, mais le pb n'est pas resolu...
      Mais je veux les voir en binaires
      1. Modérateur
        Dans ce cas tu vas devoir lire le tableau case par case et afficher les codes binaire de chaque byte :

        System.out.printn("Packet : ");
        for (byte b : p.data)
            System.out.print(Integer.toString(b,2));
        System.out.println();
      2. merci kx, pour votre aide... :)
        resulat:

        Packet : -10010-1000011-1111111-100000000101101000010001111000011111101001110111110100111101001110100110010111100101111000111101111110110100101-10000001100010101001101-11011100111101001110011111001111011001100101111110100111011111010011110100111010011001011110010111100011110111111011011111100101110010011001111100101110101111001011111001111101110110010111101000-1000000101011010101001011100001001010110111001011101011100101100111101111110011110101100001110101111000011101101110000111010011100101110010011001111100101-10000001000100-1000000101010101010001111010010100001111101110111-1000000101101101001001011101010101101111011101101001100111-10000001011101-1000000101101101001001011101010101101111011101100101100111-10000001011101-1000000101101101001001011101010101101111011101101011100111-10000001011101-1000000101101101001001011101010101101111011101100001100111-10000001011101-1000000101101101001001011101010101101111011101100011100111-10000001011101-1000000101101101001001011101010101101111011101101101100111-10000001011101-1000000101101101001001011101010101101111011101100111100111-10000001011101-1000000101101101001001011101010101101111000011100001100111-10000001011101-11111110001110001001101-10100001000010101010100110-100000110010-100000-10111011011011-1111000-1100110-101001110-111011-1000000-1000100010100111011-10011110100-101011-10-1011110-1000000-110010010100100101-1000101001001111-11101001010000-1000010-1000000-11010000101001000110-11111110100-101011-10-1011101-1000000-11100101001111111011001001010100-1001010-1110011-1000000-111101001010011011-100010101001010100-1001010-1110000-1000000-1010110010100-110011011110001001001111-11101001010000-1000010-1000000-100000010100111011-110010101001001111-11101001010000-1000011
        Packet : -1011001-110101100100000011111101111100101110000111101001101000110010111100101111100101110010011010011110100110100111011111101110111100011110111011011101111000111101111110110100101
        Packet : -1011001-110101-1111111-1000000001010001101111111101111100101110000111101001101000110010111100101111100101110010011010011110100110100111011111101110111100011110111011011101111000111101111110110100101-1000000110001010100100010101111110111110010111000011110100110100011001011110010-100000011100-10000001101010101001000100-1100011-1011010-111101110101-10000001101010101001000100-1100011-1011010-1000001110101-10000001101010101001000100-1100011-1011010-1000001110110-100000011100010010101111001-110010010100111101110111001111000110101110100110100111011011100101111011111000011110010110111011001011110010111101110110010111101000-100000011100010010101111001-11001001101111011101110011110011-10000001111111-100000011100010010101111001-11001001101111011101110011110101-10000001111111-100000011110110101000-10010010100-11010010010101101100-10010-1000000-11001010101000-10010010100-1110011111000100-10010-1000000-10100110101000-10010010100-11010010010101101101-10010
      3. Modérateur
        Il semble qu'il y ait des problèmes avec les byte négatifs... Tu peux alors faire comme ça :

        System.out.print(Integer.toString(b<0 ? 255+b : b,2));
        Mais je pense que ça fais à peu près ce que tu voulais, non ?
      4. oui, et merci pour votre patience....