Java wysłany i odebrany bajt się nie zgadza

0

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?

0

Chyba trudno sobie wyobrazić co może być przyczyną bez kawałka kodu.

0

poszukaj w google coś o sieciowej kolejności bajtów

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

0

Pokaż jeszcze kod z wysyłką tych bajtów.

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.");
        } 
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 andowanie każdego wczytanego bajta z 0xff.

0

Dzięki za pomoc, teraz śmiga.

1 użytkowników online, w tym zalogowanych: 0, gości: 1