Witajcie,
Wysyłam i odbieram bajty po socketach w javie i zauważyłem, że gdy wyślę bajt F3, czyli w dziesiętnym 243, to odbieram FFFFFFF3, czyli w dziesiętnym -13. O co kaman?
- Rejestracja:ponad 14 lat
- Ostatnio:ponad 11 lat
0
Bajty wysyłane:
12 42 0B 50 F3 E0 3C 1B FF 00 00 00 01 01
Kod z serwera odbierającego:
int z = we.read(cbuf,0,3);
int y = 0;
System.out.println("Wczytano bajtów : "+z);
System.out.println("Typ logu:0x"+Integer.toHexString(cbuf[0])+Integer.toHexString(cbuf[1]));
System.out.println("Długość:"+(int)cbuf[2]);
y = (int)cbuf[2];
z = we.read(cbuf,0,y);
System.out.println("Wczytano bajtów : "+z);
System.out.println("Unix time:0x"+Integer.toHexString(cbuf[0])+Integer.toHexString(cbuf[1])+Integer.toHexString(cbuf[2])+Integer.toHexString(cbuf[3]));
System.out.println("Miliseconds:0x"+Integer.toHexString(cbuf[4])+Integer.toHexString(cbuf[5]));
System.out.println("Code:0x"+Integer.toHexString(cbuf[6])+Integer.toHexString(cbuf[7])+Integer.toHexString(cbuf[8])+Integer.toHexString(cbuf[9]));
System.out.println("PPE_id:0x"+Integer.toHexString(cbuf[10]));
System.out.println(cbuf[1]);
System.out.println((int)cbuf[1]);
System.out.println(Integer.toHexString(cbuf[1]));
System.out.println(Integer.toHexString((int)cbuf[1]));
Wynik powyższego:
Wczytano bajtów : 3
Typ logu:0x1242
Długość:11
Wczytano bajtów : 11
Unix time:0x50fffffff3ffffffe03c
Miliseconds:0x1bffffffff
Code:0x0001
PPE_id:0x1
-13
-13
fffffff3
fffffff3
edytowany 1x, ostatnio: SoyeR
- Rejestracja:ponad 14 lat
- Ostatnio:ponad 11 lat
0
Kod wysyłki:
try
{
gniazdo = new Socket("localhost",4444);
}
catch(UnknownHostException e)
{
System.out.println("Nieznana nazwa hosta.");
}
catch(IOException e)
{
System.out.println("Nie można utworzyć gniazda klienta.");
}
System.out.println("Klient połączony:"+gniazdo.isConnected());
OutputStream wy = null;
try
{
wy = gniazdo.getOutputStream();
}
catch(IOException e)
{
System.out.println("Nie można pobrać strumienia wyjściowego.");
}
try
{
FileInputStream file = new FileInputStream("log_file_cut");
length = file.read(cbuf, 0, 117);
System.out.println("Wczytano "+length+" bajtów.");
}
catch(IOException e)
{
System.out.println("Błąd pliku.");
try
{
gniazdo.close();
}
catch(IOException ex)
{
System.out.println("Nie można zamknąć gniazda klienta.");
}
}
System.out.println("Próba wysyłania...");
try
{
if(wy != null)
{
wy.write(cbuf);
System.out.println("Wysłano.");
}
}
catch(Exception e)
{
System.out.println("Nie można wpisać danych do strumienia wyjściowego OutputStream.");
}

- Rejestracja:prawie 20 lat
- Ostatnio:około 9 godzin
1
Powód jest prosty:
Bajt w Javie może przyjmować wartości od -128 do 127, przy wywoływaniu Integer.toHexString bajty są rozszerzane do intów, a więc powielany jest bit znaku (najwyższy). Receptą jest and
owanie każdego wczytanego bajta z 0xff
.
kchbr
Eh jednak co głowa to głowa ;]

Wibowit
;]