Порядковый номер целых чисел в Python - PullRequest
17 голосов
/ 09 сентября 2009

Я работаю над программой, в которой храню некоторые данные в целое число и обрабатываю их побитово. Например, я могу получить число 48, которое я буду обрабатывать побитно. В общем случае порядковый номер целых чисел зависит от машинного представления целых чисел, но делает ли Python что-нибудь, чтобы гарантировать, что целые числа всегда будут иметь младший порядок? Или мне нужно проверить порядок байтов, как в C, а затем написать отдельный код для двух случаев?

Я спрашиваю, потому что мой код работает на машине Sun и, хотя тот, на котором он сейчас работает, использует процессоры Intel, в будущем мне, возможно, придется переключиться на машину с процессорами Sun, которая, как я знаю, является старшей. 1003 *

Ответы [ 4 ]

20 голосов
/ 09 сентября 2009

Python int имеет тот же порядок байтов, что и процессор, на котором он работает. Модуль struct позволяет преобразовывать байтовые двоичные объекты в целочисленные значения (и наоборот, а также некоторые другие типы данных) как в собственном, так и в младшем или старшем порядке, в зависимости от формата Строка , которую вы выбираете: начать формат с @ или без символа с порядком байтов, чтобы использовать собственный порядок байтов (и собственные размеры - все остальное использует стандартные размеры), '~' для собственного, '<' для младшего байтов, ' > 'или'! ' для big-endian.

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

Для быстрой «объемной» обработки в простых случаях рассмотрим также модуль array - методы fromstring и tostring могут быстро обрабатывать большое количество байтов, а метод byteswap Вы можете получить «другой» порядок байтов (нативный к нативному или наоборот), опять же быстро и для большого количества элементов (всего массива).

15 голосов
/ 09 сентября 2009

Если вам необходимо обрабатывать данные «поразрядно», тогда вам может помочь модуль bitstring. Он также может иметь дело с порядком байтов между платформами (по крайней мере, в последней сборке транка - она ​​будет выпущена в ближайшие дни).

Модуль struct является лучшим стандартным методом борьбы с порядком байтов между платформами. Например, это упаковывает и распаковывает целые числа 1, 2, 3 в две «шорты» и одну «длинную» (2 и 4 байта на большинстве платформ) с использованием собственного порядка байтов:

>>> from struct import *
>>> pack('hhl', 1, 2, 3)
'\x00\x01\x00\x02\x00\x00\x00\x03'
>>> unpack('hhl', '\x00\x01\x00\x02\x00\x00\x00\x03')
(1, 2, 3)

Для проверки порядкового номера платформы программно вы можете использовать

>>> import sys
>>> sys.byteorder

, который либо вернет "big", либо "little".

2 голосов
/ 09 сентября 2009

Проверить когда?

При выполнении побитовых операций тип int будет иметь ту же последовательность, что и введенные вами значения. Вам не нужно это проверять. Об этом нужно помнить только при преобразовании в / из последовательностей байтов на обоих языках afaik.

В Python для этого вы используете модуль struct, чаще всего это struct.pack () и struct.unpack ().

1 голос
/ 12 декабря 2013

Следующий фрагмент расскажет вам, является ли ваш системный стандарт по умолчанию прямым порядком байтов (в противном случае это big-endian)

import struct
little_endian = (struct.unpack('<I', struct.pack('=I', 1))[0] == 1)

Обратите внимание, однако, что это не повлияет на поведение побитовых операторов: 1<<1 равно 2 независимо от значения по умолчанию вашей системы.

...