Domanda

Voglio usare Preon per il progetto che comunica con un server scritto in C. Il protocollo dipende l'endianess nativo della macchina (si può risolvere con thisjava.nio.ByteOrder.getNative() sotto l'ipotesi che la JVM ha lo stesso endianess come server) e usi uint64_t per lunghezze di dati e int32_t per codici di stato (un valore negativo indica un errore).

non ho potuto trovare informazioni su signedness nella documentazione Preon. Ho avuto un rapido sguardo al codice sorgente e ha scoperto che i turni usi nl.flotsam.preon.buffer.DefaultBitBuffer firmati (<< e >>) ei commenti Javadoc di diversi metodi in nl.flotsam.preon.buffer.BitBuffer indicano anche che utilizza interi con segno, ma il javadoc commento nl.flotsam.preon.buffer.BitBuffer dice che BitBuffer utilizza interi senza segno. Questo mi ha confuso.

Qual è il formato intero predefinito di Preon? Come faccio a rappresento uint64_t e int32_t?

È stato utile?

Soluzione

Per i dati contrassegnati con @BoundNumber, il valore predefinito è LittleEndian. È possono di override che in questo modo:

@BoundNumber(byteOrder=BigEndian)

... ma specifica piattaforma attualmente non è un'opzione. Che è una limitazione. Si potrebbe prendere in considerazione il deposito di un problema per esso. (In caso contrario, io, da qualche parte nel futuro.)

Il modo in cui ho potuto vedere che il lavoro è quello di avere solo un altro costante enum, chiamato Platform.

Aggiornamento:

Per ordine dei byte, Preon ora (attualmente disponibile solo in testa) ha tre opzioni: BigEndian, LittleEndian e nativo. Native determinazione volontà in ordine di byte indicato da java.nio.ByteOrder.getNative ().

Di conseguenza, è ora possibile scrivere il codice in questo modo:

@BoundNumber(byteOrder=Native) int value;

... che si traduce in un intero a 32 bit con segno, con ordine byte basata sull'architettura.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top