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

Я хочу использовать 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?


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


Ответы (1)


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

@BoundNumber(byteOrder=BigEndian)

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

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

Обновление:

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

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

@BoundNumber(byteOrder=Native) int value;

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

person Wilfred Springer    schedule 23.08.2010
comment
О, и из-за некоторых проблем с Codehaus я сейчас отправляю на Github, а не в репозиторий Codehaus. Простите за неудобства. Надеюсь, что это будет решено в ближайшее время. - person Wilfred Springer; 23.08.2010
comment
Спасибо. Насколько я понял, формат по умолчанию для целых чисел в Preon подписан. Тогда @BoundNumber(size = "32") long value может представлять uint32_t. А как же uint64_t? Может ли он быть представлен в BigInteger? - person ; 24.08.2010
comment
Это было бы возможно, однако для этого потребуется зарегистрировать еще один CodecFactory, который (в своем методе create(...)) будет запускаться комбинацией типа BigInteger и наличием аннотации BigNumber. - person Wilfred Springer; 25.08.2010