Java шестнадцатеричный - PullRequest
6 голосов
/ 08 января 2012

У меня есть сообщение

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> диапазон

Ответы [ 2 ]

4 голосов
/ 08 января 2012

Вы, вероятно, хотите использовать 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();
    }
}

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

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

2 голосов
/ 09 января 2012

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...