Подобная функциональность для Java, чтобы структурировать для Python - PullRequest
5 голосов
/ 24 мая 2011

У меня есть программа, которую я создал на Python, чтобы найти определенные теги в IFD TIFF и вернуть значения. Это было просто доказательство концепции в Python, и теперь мне нужно перенести функциональность в Java. Я думаю, что я могу просто использовать конструктор String(byteArray[]) для типов данных ASCII, но мне все еще нужно получить значения Unsigned short (2 byte) и unsigned long (4 byte). Мне не нужно записывать их обратно в файл или изменять их, все, что мне нужно сделать, это получить от них объект Java Integer или Long. Это легко в python с классами struct и mmap, кто-нибудь знает подобный способ в Java? Я посмотрел на класс DataInput, но метод readUnsignedLong читает 8 байтов.

Ответы [ 5 ]

5 голосов
/ 24 мая 2011

DataInputStream позволяет читать короткие и длинные. Вы должны замаскировать их соответствующей битовой маской (0xFFFF для краткости, 0xFFFFFFFF для 32-битной), чтобы учесть разницу между типами со знаком и без знака.

, например

// omits error handling
FileInputStream fis = ...;
DataInputStream stream = new DataInputStream(fis);
int short_value = 0xFFFF & stream.readShort();
long long_value = 0xFFFFFFFF & stream.readInt();

Если вы уверены, что данные не будут находиться в верхнем конце 2-байтового поля или 4-байтового поля, вы можете отказаться от битовой маскировки. В противном случае вам необходимо использовать более широкий тип данных, чтобы учесть тот факт, что значения без знака содержат больший диапазон значений, чем их подписанные аналоги.

2 голосов
/ 24 мая 2011

DataInput будет предпочтительным методом. Вы можете использовать readUnsignedShort для двухбайтовых значений. Для 4-байтовых значений вам придется использовать этот обходной путь ...

long l = dis.readInt() & 0xffffffffL;
2 голосов
/ 24 мая 2011

Я посмотрел на класс DataInput, но метод readUnsignedLong читает 8 байтов.

Java не имеет неподписанных типов. Требуется 4 байта для создания int и 8 байтов для создания long без знака или иным образом.


Если вы не хотите использовать DataInput, вы можете прочитать байты в байтовые массивы (byte[]) и использовать ByteBuffer, чтобы превратить эти байтовые значения в int s. и long с левым отступом. См ByteBuffer#getInt() и ByteBuffer#getLong().

1 голос
/ 01 июня 2011

Preon Library хорошо для создания структуры в Java.Я попробовал Javolution'S Struct, но это не помогло в полной мере.Это открытый исходный код и очень хорошая библиотека.

1 голос
/ 24 мая 2011

Вы можете использовать класс Javolution Struct , который обеспечивает структуру областей данных. Вы устанавливаете оболочку, а затем используете оболочку для доступа к данным. Simples. Java действительно нуждается в этом супер-полезном классе в своем пути к классам по умолчанию TBQH.

...