Bezdepbonusu7Программирование: статьи и ответы

Вопрос

Знаковые и беззнаковые целые числа в Preon

Автор вопроса: CommunityОтветов: 1

Я хочу использовать Preon для проекта, который взаимодействует с сервером, написанным на C. Протокол зависит от исходного порядка байтов. машины (вы можете решить с помощью thisjava.nio.ByteOrder.getNative() в предположении, что JVM имеет тот же порядок байтов, что и сервер) и использует uint64_t для длин данных и int32_t для кодов состояния (отрицательное значение указывает на ошибку).

Я не смог найти информацию о подписи в документации Preon. Я быстро просмотрел исходный код и обнаружил, что nl.flotsam.preon.buffer.DefaultBitBuffer использует сдвиги со знаком (<< и >>), а комментарии javadoc для нескольких методов в nl.flotsam.preon.buffer.BitBuffer также указывают, что он использует целые числа со знаком, но комментарий javadoc nl.flotsam.preon.buffer.BitBuffer говорит, что BitBuffer использует целые числа без знака. Это смутило меня.

Каков целочисленный формат Preon по умолчанию? Как представить uint64_t и int32_t?

  • Маленькая точка ByteBuffer по умолчанию использует обратный порядок байтов (сетевой порядок) и может быть переключен на обратный порядок байтов. Родной endianess машины не имеет значения и не учитывается. Вы можете определить исходный порядок байтов, но если вы знаете, что вам нужно, просто используйте это. Peter Lawrey 22.08.2010
  • Я не знаю, какой порядок байтов мне нужен, но я могу легко определить это во время выполнения через java.nio.ByteOrder.getNative(). Так что endianess не проблема. 22.08.2010

javainteger64-bitunsignedpreon

Ответы

Ответ 1 · Wilfred Springer

Для данных, помеченных @BoundNumber, по умолчанию используется LittleEndian. Вы можете переопределить это следующим образом:

@BoundNumber(byteOrder=BigEndian)

... но конкретная платформа в настоящее время не подходит. Это ограничение. Возможно, вы захотите рассмотреть вопрос о регистрации проблемы для этого. (В противном случае я это сделаю где-то в будущем.)

Я мог видеть, как это работает, просто иметь еще одну константу перечисления, называемую Platform.

Обновление:

Что касается порядка байтов, Preon теперь (в настоящее время доступен только в голове) имеет три варианта: BigEndian, LittleEndian и Native. Native разрешается в порядке байтов, указанном java.nio.ByteOrder.getNative().

Как следствие, теперь можно написать такой код:

@BoundNumber(byteOrder=Native) int value;

... что преобразуется в 32-битное целое число со знаком, порядок байтов которого зависит от архитектуры.

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы