Pergunta

Eu estou trabalhando em um programa onde eu armazenar alguns dados em um inteiro e processá-lo bit a bit. Por exemplo, eu poderia receber o número 48, que irá processar bit-por-bit. Em geral, a ordenação de inteiros depende da representação máquina de inteiros, mas não Python fazer nada para garantia de que os ints será sempre little-endian? Ou será que eu preciso verificar endianness como eu faria em C e, em seguida, escrever um código separado para os dois casos?

Eu pergunto porque meus código é executado em uma máquina Sun e, embora o que está sendo executado agora usa processadores Intel, eu poderia ter de mudar para uma máquina com processador Sun no futuro, que eu sei é big-endian.

Foi útil?

Solução

int do Python tem o mesmo endianness como o processador funciona em. A struct módulo permite converter blobs byte para ints (e vice-versa, e alguns outros tipos de dados também) em ambos, little-endian nativo, ou maneiras big-endian, dependendo do string de formato você escolhe: comece o formato com @ ou nenhum personagem endianness usar endianness nativa (e tamanhos nativos - Outros usos tamanhos standard), '~' para nativa, '<' para little-endian ' >' ou '!' para big-endian.

Esta é byte a byte, não bit a bit; Não tenho certeza exatamente o que você quer dizer com processamento bit-por-bit neste contexto, mas presumo que podem ser acomodados de forma semelhante.

Para rápido "a granel" processamento em casos simples, considere também o módulo variedade - - os métodos fromstring e tostring pode operar em grande número de bytes rapidamente, eo método byteswap você pode obter o endianness "outro" (nativa da não-nativos ou vice-versa), novamente rapidamente e por um grande número de itens (o todo matriz).

Outras dicas

Se você precisa para processar seus dados de bit a bit ', em seguida, o bitstring módulo de poder ser de ajuda para você. Ele também pode lidar com endianness entre as plataformas (na versão mais recente do tronco, pelo menos - a ser lançado nos próximos dias).

O struct módulo é o melhor método padrão de lidar com endianness entre plataformas. Por exemplo esta pacotes e desempacotar os números inteiros 1, 2, 3 em dois 'calção' e uma 'longa' (2 e 4 bytes na maioria das plataformas) utilizando endianness nativo:

>>> 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)

Para verificar o endianness da plataforma de programação que você pode usar

>>> import sys
>>> sys.byteorder

o que quer "big" retorno ou "little".

Verifique quando?

Ao fazer operações bit a bit, o int no terão a mesma endianess como os ints que você colocou no. Você não precisa verificar isso. Você só precisa se preocupar com isso quando convertendo para / de seqüências de bytes, em ambas as línguas, afaik.

Em Python você usa o módulo struct para isso, mais comumente struct.pack () e struct.unpack ().

O trecho a seguir irá dizer-lhe se o seu padrão do sistema é pouco endian (caso contrário, é big-endian)

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

Note, no entanto, isso não afetará o comportamento dos operadores bit a bit:. 1<<1 é igual a 2 independentemente da ordenação padrão do seu sistema

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top