Как определить размер слова в Python - PullRequest
3 голосов
/ 03 августа 2011

Мне нужно знать количество байтов в «слове» в Python. Причина, по которой мне это нужно, состоит в том, что у меня есть количество слов, которые мне нужно прочитать из файла; если бы я знал количество байтов в слове, я мог бы использовать функцию file.read(num_bytes) для считывания соответствующего количества из файла.

Как определить количество байтов в слове?

Ответы [ 6 ]

5 голосов
/ 03 августа 2011

Вы можете использовать функцию platform.architecture:

>>> import platform
>>> platform.architecture()
('64bit', '')

Обратите внимание на примечание на той же странице:

Примечание В Mac OS X (и, возможно, на других платформах) исполняемые файлы могут быть универсальными файлами с несколькими архитектурами. Чтобы получить «64-разрядность» текущего интерпретатора, более надежно запросить атрибут sys.maxsize:

is_64bits = sys.maxsize > 2**32

Пожалуйста, имейте в виду, что это дает размер слова, с которым был скомпилирован интерпретатор python. Вы можете получить значение 32 на 64-битном хосте, если python скомпилирован в 32-битном режиме.

Если файл создан другим исполняемым файлом и у вас есть доступ к этому исполняемому файлу, вы можете использовать первый необязательный аргумент для функции platform.architecture:

>>> p.architecture('/path/to/executable')
('32bit', '')
1 голос
/ 03 августа 2011

В Python нет понятия «слово», когда вы читаете двоичные данные из файла, вы можете явно указать, сколько байтов следует читать за раз.

С точки зрения компилятора и / или платформы, «WORD» обычно определяет размер основного блока данных. И Python не зависит от такого рода вещей:)

0 голосов
/ 22 мая 2017

Возможно, что следующее может быть уместным и полезным: Предположим, вы проверяете 32-битный код. Посмотрите, вернется ли (-1) << 31 как долго или нет. Для 32-разрядных это не так, в то время как (-1) << 32 и 1 << 31 делают. </p>

0 голосов
/ 17 апреля 2013

Как насчет этого:

def machine_word_size():
    import sys
    num_bytes = 0
    maxint = sys.maxint
    while maxint > 0:
        maxint = maxint >> 8
        num_bytes += 1
    return num_bytes
0 голосов
/ 03 августа 2011

Мне нужно знать количество байтов в «слове» в Python.Причина, по которой мне это нужно, в том, что у меня есть количество слов, которое мне нужно прочитать из файла

Затем вам нужно спросить человека, который написал файл.Он не имеет ничего общего с Python и не имеет ничего общего с тем, каков настоящий формат файла.Довольно странно, что файл определяется как последовательность слов.Скорее всего, это последовательность из 16- или 32-разрядных целых чисел, иначе это на самом деле слова в текстовом смысле, и в этом случае вы действительно сканируете файл на наличие токенов между разделителями.

0 голосов
/ 03 августа 2011

Нет действительно правильного определения того, что такое слово; за исключением того, что некоторые архетектуры называют некоторое количество байтов словом (x86 вызывает 2 байта словом, PPC вызывает 4 байта словом), но кроме этого произвольного значения не так много значения.

Пожалуй, самое простое решение - просто отложить на модуль struct; например, формат 'h' означает подписанный шорт (что разумно согласуется с определением слова «слово»). Чтобы вы могли сделать это:

>>> import struct
>>> f = file('.vimrc')
>>> struct.unpack('h', f.read(struct.calcsize('h')))
(8226,)
>>> 
...