У меня есть четко определенные двоичные данные, и я хочу написать Java API для него.
Формат файла подобенJava: разбор двоичных данных без знака
File Signature char[4] 4 bytes
File Source ID unsigned short 2 bytes
Header Size unsigned long 4 bytes
Max double 8 bytes
Я использую DataInputStream
для анализа данных. char
легко разобрать, без проблем. Но unsigned
не может быть правильно разобран.
Я знаю, что Java не имеет беззнакового числа. Как его преобразовать? (Пожалуйста, примите пример unsigned long как пример).
EDIT
Вот код, который я Worte:
File file = new File("lidar.las");
DataInputStream in= new DataInputStream(new FileInputStream(file));
in.skipBytes(6);
long read = (long) (in.readInt() & 0xFFFFFFFFL);
System.out.println("read " + read);
выход
чтения 3288596480
мое ожидаемое число - 1220 . Я не знаю кода, который написал эту двоичную запись, возможно, в c. Все, что я хочу, это написать версию Java для чтения данных.
решаемые
Я не уверен, что могу ответить на мой собственный вопрос. LOL
В любом случае, вот решения.
private static int getSignedInt(final int unsignedInt){
ByteBuffer bb=ByteBuffer.allocate(1024*4);
bb.putInt(unsignedInt).flip();
int result =bb.order(ByteOrder.LITTLE_ENDIAN).getInt();
bb.clear();
return result;
}
Вам нужно сделать какую-то математику с ними? И вам нужно 8-байтовое целое без знака? Очевидный ответ заключается в том, чтобы прочитать их в целые числа со знаком, например, 4-байтовые беззнаковые длинные вставки на Java длинные. – Radiodef
unsigned long не будет 4 байта в любой современной системе. Это в стороне, так как Java предлагает 8-байтовый подписанный длинный, который покрывает его. –