2012-01-08 1 views
5

У меня есть сообщениеJava шестнадцатеричного

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

Я знаю, что данные правы, так как из Я пишу их COM-порт с RxTx, и я получил правильную реакцию HW

Я знаю, что 0x01 значение 1, и отправлено действительно как 01 (это два бита, четверть байта)

Когда мне нужно настроить сообщение, генерирует значения, подобные этому?

message[index] = 1 & 0xff 

Я вижу выход этого фрагмента, и это выглядит правильно

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

Есть ли лист вы бы рекомендовать мне читать?
хранит эти цифры в int права, так как мы не можем использовать byte (-128, +127) для значений до <0x00, 0xFF> диапазона

+0

Вы можете использовать байты. Но вы должны указать каждое значение байту: 'byte [] message = {(byte) 0xff};' –

+1

* "Я знаю, что OxO1 является 1 значением и отправляется как 01 (это два бита)" * Нет, если только вы делаете что-то, чтобы это произошло. Java 'int' - это 32-битное значение ([ссылка] (http://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html)). Просто потому, что значение не требует * все эти биты не означает, что они не отправляются.Размер того, что вы отправляете, может быть ограничен тем, как вы его отправляете, но, учитывая другие значения, которые вы цитируете, вы можете быть уверены, что отправляете по меньшей мере восемь бит. –

+0

Возможно, вам стоит подумать об использовании ByteBuffer – fge

ответ

4

Вы, вероятно, хотите использовать ByteBuffer для того, что вам нужно, и обернуть его под классом.

Я не знаю, ваш точный формат сообщения, но, скажем, на мгновение это 3 байта данных и 1 байт в порт:

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(); 
    } 
} 

Вы можете даже использовать хэш-код ByteBuffer() и равных() для сравнения сообщений, , если вы используете только абсолютные методы get/put (в противном случае совсем немного гимнастики в порядке).

Я использовал эту технику для чтения/записи пакетов NRPE.

2

Я знаю, что 0x01 1 значение, и послал действительно как 01 (это два бита)

Это только справедливо, если вы делаете что-то, чтобы это произошло. Java int - это 32-битное значение (reference). Просто потому, что значение не требует, чтобы все эти биты не означали, что они не отправлены, потому что вам может нужны все биты для другого значения. Размер того, что вы отправляете, может быть ограничен тем, как вы его отправляете, но, учитывая другие значения, которые вы цитируете, вы можете быть уверены, что отправляете по меньшей мере восемь бит.

Если вы используете OutputStream#write, то, что отправляется, будет полностью зависеть от конкретной реализации. OutputStream - абстрактный класс, определяющий семантику для записи в потоки; он не определяет сам поток. Для фактического определения того, что получается, требуется конкретный подкласс. A FileOutputStream и ByteArrayOutputStream и PipedOutputStream все данные выводятся по-разному.

Смежные вопросы