struct.unpack_from в Java - PullRequest
       24

struct.unpack_from в Java

1 голос
/ 30 января 2011

У меня есть следующая инструкция на Python, которую я хотел бы понять и перевести на Java

values = struct.unpack_from('>%dL' % 96, input_content, 0)

Что означает>% dL?Я проверил документ из Python http://docs.python.org/library/struct.html, но ничего о процентах.Должен ли я рассматривать каждое возвращаемое значение как байт в Java и приводить его к удвоенному или длинному значению?

Спасибо за помощь.

Ответы [ 3 ]

3 голосов
/ 30 января 2011

%d - это формататор строк Python, аналогичный тому, который есть в C.То, что он говорит, это помещает то, что следует после закрывающей кавычки, вместо форматера, в данном случае 96 вместо %d.%d указывает целое десятичное число со знаком.

'>%dL'%96 - это инструкция для struct.unpack, которая говорит о том, что для распаковки необходима длинная последовательность без знака с прямым порядком без знака и десятичная дробь без знака внутри.Перед передачей '>%dL' в unpack, однако форматирование строки разрешается и '>%dL' становится '>96L'.Взгляните на раздел форматных строк в `struct.unpack docs

http://docs.python.org/library/stdtypes.html#string-formatting

http://docs.python.org/library/struct.html?highlight=struct.unpack#format-strings

2 голосов
/ 30 января 2011

Если бы я написал то же самое в Java, это могло бы быть что-то вроде:

DataInputStream inputcontent = new DataInputStream(in);
long[] values = new long[96];
for (int i = 0; i < 96; i++)
    values[i] = inputcontent.readLong();

с той разницей, что код Python использует уже загруженные байты.

Многиеспасибо Джону Мачину и Матти за их объяснение.

2 голосов
/ 30 января 2011

Интерактивная подсказка Python - ваш друг:

>>> '>%dL' % 96
'>96L'
>>>

Итак,

values = struct.unpack_from('>%dL' % 96, input_content, 0)

эквивалентно

values = struct.unpack_from('>96L', input_content, 0)

и документы struct должны сообщать вам, что '> 96L' означает 96 бигендовских 32-разрядных целых чисел без знака.

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

...