Полученние правильного байта из InputStream

 
 
 
Сообщения:2
Подключаюсь сокетом к серверу и считываю по байтно его ответ, все отлично пока сервер не посылает байт со значением 0xff которое мне приходит абсолютно не то. Но если это же значение отправить то интерпретируется оно как 0xff.

Код вывода массива байт:

	static private char hex[] = {
		'0', '1', '2', '3', '4', '5', '6', '7',
		'8', '9', 'a', 'b', 'c', 'd', 'e', 'f'
	};
	static private String bts(byte value) // Byte to string
	{
		return "" + hex[(value >> 4) & 0x0F] + hex[value & 0x0F];
	}

	static private void log(byte data[])
	{
		int lineNumber = 0;
		int position = 0;
		int length = data.length;
		while (position <= length)
		{

			System.out.print("0x" + bts((byte) ((position >> 8) & 0xff)) + bts((byte) (position & 0xff)) + "  ");
			
			int last = 0;
			for (int i = 0; i < 16 && position + i < length; i++)
			{
				System.out.print(bts(data[position + i]) + " ");
				if (i == 7)
					System.out.print(" ");
				
				last = i;
			}

			last = 16 - last;
			if (last < 7)
				System.out.print(" ");
			while (last-- > 1)
				System.out.print("   ");
			
			System.out.print("  ");

			for (int i = 0; i < 16 && position + i < length; i++)
			{
				int symbol = data[position + i];
				if (symbol < 0x20 || symbol > 0x7e)
					symbol = '.';
				System.out.print((char)symbol);
			}
			System.out.print("\n");
			lineNumber++;
			position = (short) (lineNumber * 16);

		}
	}
	
	static public void dumpBuf(byte buf[], boolean toServer)
	{
		System.out.println("***** Starting dump *****");
		if (toServer)
			System.out.println("Client -> Server");
		else
			System.out.println("Server -> Client");
		log(buf);
		System.out.println("\n***** End dump *****");
	}


Код получения данных из сети, in - InputStream сокета s

while (true)
		{
			if (s != null && s.isConnected() && in.available() >= 6)
			{
				byte firstBytes[] = new byte[6];
				ArrayList<Byte> data = new ArrayList<Byte>();
				int c;
				int count = 0;
				while ((c =  in.read()) != -1 && count < 6)
				{
					data.add(new Byte((byte) c));
					count++;
				}

				data.add(new Byte((byte) c));
				
				if (data.get(0).byteValue() != 0x2a)
				{
					System.out.println("CRITICAL: First byte is not 0x2a!!!");
					JICQLog.dumpBuf(JICQConvertions.getBytesFromArrayList(data), false);
					byte d[] = new byte[in.available()];
					in.read(d);
					JICQLog.dumpBuf(d, false);
					continue;
				}
				
				byte simpleData[] = JICQConvertions.getBytesFromArrayList(data);
				short length = (short) (simpleData[4]*256 + simpleData[5]);
				int bytesRecieved = 0;
				for (int i = 0; i < length - 1; i++)
				{
					c =  in.read();
					data.add(new Byte((byte) c));
					bytesRecieved++;
				}

				
				
				byte result[] = JICQConvertions.getBytesFromArrayList(data);
				if (bytesRecieved != length - 1)
				{
					System.out.println("Data are not full!!!");
					JICQLog.dumpBuf(result, false);
					continue;
				}
				
				if (delegate != null)
					delegate.processFrame(new JICQFrame(result), this);
			}
			this.sleep(100);
		}



Сниффером смотрю отправленные сервером мне данные

64.12.200.89:5190(aol) -> 192.168.51.62:65218(unknown)
TTL: 101        Window: 16384   Version: 4      Lenght: 346
FLAGS: ---PA--  SEQ: 1413957463 - ACK: 1695923615
Packet Number: 8

---[ TCP Hex-Ascii Data ]--------------------------------------------
0x0000    2a04 18ff 012c 00ff 0001 0000 0100 0934    *....,.........4
0x0010    3937 3639 3738 3332 0005 0012 3230 352e    97697832....205.
0x0020    3138 382e 382e 3232 363a 3531 3930 0006    188.8.226:5190..
0x0030    0100 2b0b ffff 2040 ffff ffff 0cff ffff    [email protected]{.....%
0x0040    1842 ffff 0a4f ffff ffff 041b ffff 1968    .B.o.O...B...5.h
0x0050    50ff 094f 3301 ffff 7438 ffff ffff ffff    P..O3...t8......
0x0060    ffff ffff 6f40 ffff 446a 5d2c ffff 2c61    [email protected]],..,a
0x0070    43ff ffff 69ff ffff 3544 7eff 473c ffff    C...i...5D~.G<.K
0x0080    ffff ffff 2e5b 4fff 15ff ffff 33ff ffff    ...~.[O.....3...
0x0090    ffff ffff 51ff ffff 69ff 55ff ffff ffff    .!..Q...i.U..".#
0x00a0    00ff ffff 5e55 58ff ffff ffff ffff 4fff    ....^UX.......O.
0x00b0    5179 3c0b ffff 0d01 42ff ffff 3665 ffff    Qy<.....B...6e.N
0x00c0    5376 ffff ffff ffff 7376 19ff 14ff 26ff    Sv.....asv....&.
0x00d0    ffff 2cff 5aff 1854 ffff ffff ffff ffff    ..,.Z..T.....f.u
0x00e0    4b5c ffff ffff 640e 56ff 21ff ffff 5d7a    K\.R..d.V.!..*]z
0x00f0    65ff ffff ffff ffff ffff ffff 7cff 61ff    e..F.....[..|.a.
0x0100    43ff ffff ffff ffff ffff 5946 47ff 12ff    C......6..YFG...
0x0110    7851 ffff ffff ffff ffff ffff ffff ffff    [email protected]^.t
0x0120    3d42 ffff 4834 ffff ffff 07ff 51ff 3bff    =B..H4...G..Q.;.
0x0130    ffff                                       ..


Что получил я:

Server -> Client
0x0000  2a 04 18 c4 01 2c 00 8e  00 01 00 00 01 00 09 34    *....,.........4
0x0010  39 37 36 39 37 38 33 32  00 05 00 12 32 30 35 2e    97697832....205.
0x0020  31 38 38 2e 38 2e 32 32  36 3a 35 31 39 30 00 06    188.8.226:5190..
0x0030  01 00 2b 0b 95 d9 20 40  e6 7b ab 83 0c d7 ce 25    ..+... @.{.....%
0x0040  18 42 d1 6f 0a 4f b1 1d  87 42 04 1b db 35 19 68    .B.o.O...B...5.h
0x0050  50 86 09 4f 33 01 d8 0a  74 38 d7 aa 96 d4 ce ed    P..O3...t8......
0x0060  c3 1c f8 d7 6f 40 9f 0f  44 6a 5d 2c dd de 2c 61    [email protected]],..,a
0x0070  43 d9 ec 98 69 c6 8c b2  35 44 7e cb 47 3c cb 4b    C...i...5D~.G<.K
0x0080  9e 9d 86 7e 2e 5b 4f e1  15 98 b3 e6 33 95 e3 8e    ...~.[O.....3...
0x0090  cc 21 b7 94 51 cb cb db  69 c6 55 fe 86 22 bc 23    .!..Q...i.U..".#
0x00a0  00 93 c5 97 5e 55 58 86  c2 03 c2 02 da bd 4f f5    ....^UX.......O.
0x00b0  51 79 3c 0b 91 c2 0d 01  42 a4 ed f1 36 65 87 4e    Qy<.....B...6e.N
0x00c0  53 76 b9 03 c9 20 c1 61  73 76 19 b7 14 a4 26 ad    Sv... .asv....&.
0x00d0  95 c6 2c a2 5a f9 18 54  98 05 b7 cd bc 66 df 75    ..,.Z..T.....f.u
0x00e0  4b 5c b1 52 da dc 64 0e  56 db 21 c4 ec 2a 5d 7a    K\.R..d.V.!..*]z
0x00f0  65 fc d6 46 a3 fe 95 b2  cc 5b fa f4 7c 97 61 e1    e..F.....[..|.a.
0x0100  43 c6 b0 c9 de e7 a0 36  d6 eb 59 46 47 97 12 84    C......6..YFG...
0x0110  78 51 e1 8a 9c 1c 8b 09  98 6e 8a 40 d9 5e a2 74    [email protected]^.t
0x0120  3d 42 f0 14 48 34 e0 a7  bf 47 07 86 51 c9 3b bc    =B..H4...G..Q.;.
0x0130  8c bf 


Но самое интересное, что когда я из программы отправляю полученные мною странные значения, сниффер пишет что они 255 =)

Пакет который я отправляю:

Client -> Server
0x0000  2a 01 00 02 01 08 00 00  00 01 00 06 01 00 2b 0b    *.............+.
0x0010  95 d9 20 40 e6 7b ab 83  0c d7 ce 25 18 42 d1 6f    .. @.{.....%.B.o
0x0020  0a 4f b1 1d 87 42 04 1b  db 35 19 68 50 86 09 4f    .O...B...5.hP..O
0x0030  33 01 d8 0a 74 38 d7 aa  96 d4 ce ed c3 1c f8 d7    3...t8..........
0x0040  6f 40 9f 0f 44 6a 5d 2c  dd de 2c 61 43 d9 ec 98    [email protected]],..,aC...
0x0050  69 c6 8c b2 35 44 7e cb  47 3c cb 4b 9e 9d 86 7e    i...5D~.G<.K...~
0x0060  2e 5b 4f e1 15 98 b3 e6  33 95 e3 8e cc 21 b7 94    .[O.....3....!..
0x0070  51 cb cb db 69 c6 55 fe  86 22 bc 23 00 93 c5 97    Q...i.U..".#....
0x0080  5e 55 58 86 c2 03 c2 02  da bd 4f f5 51 79 3c 0b    ^UX.......O.Qy<.
0x0090  91 c2 0d 01 42 a4 ed f1  36 65 87 4e 53 76 b9 03    ....B...6e.NSv..
0x00a0  c9 20 c1 61 73 76 19 b7  14 a4 26 ad 95 c6 2c a2    . .asv....&...,.
0x00b0  5a f9 18 54 98 05 b7 cd  bc 66 df 75 4b 5c b1 52    Z..T.....f.uK\.R
0x00c0  da dc 64 0e 56 db 21 c4  ec 2a 5d 7a 65 fc d6 46    ..d.V.!..*]ze..F
0x00d0  a3 fe 95 b2 cc 5b fa f4  7c 97 61 e1 43 c6 b0 c9    .....[..|.a.C...
0x00e0  de e7 a0 36 d6 eb 59 46  47 97 12 84 78 51 e1 8a    ...6..YFG...xQ..
0x00f0  9c 1c 8b 09 98 6e 8a 40  d9 5e a2 74 3d 42 f0 14    [email protected]^.t=B..
0x0100  48 34 e0 a7 bf 47 07 86  51 c9 3b bc 8c bf          H4...G..Q.;...


Сниффер показывает:

192.168.51.62:59261(unknown) -> 205.188.8.226:5190(aol)
TTL: 64         Window: 65535   Version: 4      Lenght: 310
FLAGS: ---PA--  SEQ: 3806766289 - ACK: 684442181
Packet Number: 18

---[ TCP Hex-Ascii Data ]--------------------------------------------
0x0000    2a01 0002 0108 0000 0001 0006 0100 2b0b    *.............+.
0x0010    ffff 2040 ffff ffff 0cff ffff 1842 ffff    [email protected]{.....%.B.o
0x0020    0a4f ffff ffff 041b ffff 1968 50ff 094f    .O...B...5.hP..O
0x0030    3301 ffff 7438 ffff ffff ffff ffff ffff    3...t8..........
0x0040    6f40 ffff 446a 5d2c ffff 2c61 43ff ffff    [email protected]],..,aC...
0x0050    69ff ffff 3544 7eff 473c ffff ffff ffff    i...5D~.G<.K...~
0x0060    2e5b 4fff 15ff ffff 33ff ffff ffff ffff    .[O.....3....!..
0x0070    51ff ffff 69ff 55ff ffff ffff 00ff ffff    Q...i.U..".#....
0x0080    5e55 58ff ffff ffff ffff 4fff 5179 3c0b    ^UX.......O.Qy<.
0x0090    ffff 0d01 42ff ffff 3665 ffff 5376 ffff    ....B...6e.NSv..
0x00a0    ffff ffff 7376 19ff 14ff 26ff ffff 2cff    ...asv....&...,.
0x00b0    5aff 1854 ffff ffff ffff ffff 4b5c ffff    Z..T.....f.uK\.R
0x00c0    ffff 640e 56ff 21ff ffff 5d7a 65ff ffff    ..d.V.!..*]ze..F
0x00d0    ffff ffff ffff ffff 7cff 61ff 43ff ffff    .....[..|.a.C...
0x00e0    ffff ffff ffff 5946 47ff 12ff 7851 ffff    ...6..YFG...xQ..
0x00f0    ffff ffff ffff ffff ffff ffff 3d42 ffff    [email protected]^.t=B..
0x0100    4834 ffff ffff 07ff 51ff 3bff ffff         H4...G..Q.;...


Как узнать из прогаммы, что получено значение 255? Так то это не очень мешает, пока в поле длинна не оказывается это значение, в этом случае вычисляется неправильно.
 
 
Сообщения:2
Всем спасибо, метод был неоднократно перерефакторен, а пакеты проверены ручками, оказалось, что сниффер nast, запущеный с опциями -x -f "port 5190" показывал не достоверные данные.


новый метод

public byte[] waitForData() throws Exception
	{
		boolean waitForData = false;
		byte header[] = new byte[6];
		int packetLen = 0;
		byte packet[] = null;
		
		while (true)
		{
			
			if (s != null && s.isConnected() && in.available() >= 6)
			{

				if (!waitForData)
				{
					in.read(header, 0, 6);
					packetLen = (header[4] << 8) & 0xFF00;
					packetLen |= header[5] & 0xFF;
					packet = new byte[packetLen + 6];
				}
			    
			    if (in.available() >= packetLen)
			    {
			        in.read(packet, 6, packetLen);
			        System.arraycopy(header, 0, packet, 0, 6);
			        waitForData = false;
			    }
				
				if (delegate != null)
					delegate.processFrame(new JICQFrame(packet), this);
			}
			this.sleep(100);
		}
	}
 
Модераторы:Нет
Сейчас эту тему просматривают:Нет