2012-01-08 9 views
5

Mam wiadomośćJava szesnastkowy

static int[] message = { 
     0x01, 0x10, 0x00, 
     0x01, // port addres 01 - 08 
     0x00, 0x01, 0x02, 
     0x06, 0x00, 
     0xA4, 0x21 
}; 

Wiem, że dane są w porządku, od Piszę je do portu COM z RxTx i mam właściwą reakcję HW

wiem, że 0x01 to jest wartość 1 i jest wysyłana naprawdę jak 01 (czyli dwa bity o długości ćwierć bajta)

Kiedy muszę dostosować komunikat, czy generowanie takich wartości jest prawidłowe?

message[index] = 1 & 0xff 

widzę wyjście z tego fragmentu, i wygląda prawidłowo

for (int i = 0; i < 255; i++) { 
    System.out.println(i & 0xff); 
} 

Czy istnieje arkusz chcesz polecić mi czytać?
jest przechowywanie tych numerów w int prawo, jako że nie można używać byte (-128, +127) dla wartości do <0x00, 0xFF> zakresie

+0

Możesz użyć bajtów. Ale musisz odrzucić każdą wartość do bajtu: 'byte [] message = {(byte) 0xff};' –

+1

* "Wiem, że OxO1 ma 1 wartość i jest wysyłane naprawdę jak 01 (co jest dwoma bitami)" * Nie, chyba że robisz coś, żeby to się stało. Java 'int' jest wartością 32-bitową ([odniesienie] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)). Tylko dlatego, że wartość * nie * wymaga wszystkich tych bitów, nie oznacza, że ​​nie są wysyłane.Rozmiar wysyłanych wiadomości może być ograniczony przez sposób wysyłania, ale biorąc pod uwagę inne wartości, które podajesz, możesz mieć pewność, że wysyłasz co najmniej osiem bitów. –

+0

Może powinieneś rozważyć użycie ByteBuffer – fge

Odpowiedz

4

Prawdopodobnie chcesz użyć ByteBuffer za to, co trzeba, i owinąć je na klasy.

Nie znam dokładnej format wiadomości, ale powiedzmy, że za chwilę to 3 bajty danych i 1 bajt na port:

public final class Message 
{ 
    private static final MESSAGE_SIZE = 4; 
    private static final PORT_OFFSET=3; 

    private final ByteBuffer buf; 

    public Message() 
    { 
     buf = ByteBuffer.allocate(MESSAGE_SIZE); 
    } 

    public void setPort(final byte b) 
    { 
     buf.put(PORT_OFFSET, b); 
    } 

    // etc 

    public byte[] getRaw() 
    { 
     return buf.array(); 
    } 
} 

Można nawet użyć hashCode ByteBuffer użytkownika() i wynosi() Aby porównać wiadomości, , jeśli używasz tylko bezwzględnych metod get/put (w przeciwnym razie sporo gimnastyki jest w porządku).

Użyłem tej techniki do odczytu/zapisu pakietów NRPE.

2

wiem, że to 1 wartość 0x01, i wysłał naprawdę jak 01 (czyli dwa bity)

To prawda, jeśli robisz coś, aby tak się stało. Java int jest wartością 32-bitową (reference). Tylko dlatego, że wartość nie wymaga wszystkich tych bitów, nie oznacza, że ​​nie są wysyłane, ponieważ możesz potrzebować wszystkich bitów dla innej wartości. Rozmiar wysyłanych wiadomości może być ograniczony przez sposób wysyłania, ale biorąc pod uwagę inne wartości, które podajesz, możesz mieć pewność, że wysyłasz co najmniej osiem bitów.

Jeśli używasz OutputStream#write, to, co zostanie wysłane, będzie zależało wyłącznie od konkretnej implementacji. OutputStream jest abstrakcyjną klasą określającą semantykę do pisania do strumieni; nie definiuje samego strumienia. Wymagana jest konkretna podklasa, aby rzeczywiście zdefiniować, co zostanie napisane. A FileOutputStream i ByteArrayOutputStream i wszystkie wyprowadzają dane inaczej.

Powiązane problemy