Pergunta

Eu preciso converter cordas em Python para outros tipos, tais como ints não assinados e assinados 8, 16, 32 e 64 bits, duplos, bóias e cordas.

Como posso fazer isso?

Foi útil?

Solução

Você pode converter uma string para um inteiro assinado de 32 bits com a função int:

str = "1234"
i = int(str)  // i is a 32-bit integer

Se a string não representa um inteiro, você vai ter uma exceção ValueError. Note, no entanto, que se a string não representa um inteiro, mas esse inteiro não se encaixa em um int assinado de 32 bits, então você vai realmente obter um objeto do tipo long vez.

Você pode então convertê-lo em outras larguras e signednesses com alguma matemática simples:

s8 = (i + 2**7) % 2**8 - 2**7      // convert to signed 8-bit
u8 = i % 2**8                      // convert to unsigned 8-bit
s16 = (i + 2**15) % 2**16 - 2**15  // convert to signed 16-bit
u16 = i % 2**16                    // convert to unsigned 16-bit
s32 = (i + 2**31) % 2**32 - 2**31  // convert to signed 32-bit
u32 = i % 2**32                    // convert to unsigned 32-bit
s64 = (i + 2**63) % 2**64 - 2**63  // convert to signed 64-bit
u64 = i % 2**64                    // convert to unsigned 64-bit

Você pode converter strings para ponto flutuante com a função float:

f = float("3.14159")
flutua

Python são o que as outras línguas se referem como double, ou seja, eles são 64-bits. Não há carros alegóricos de 32 bits em Python.

Outras dicas

Os seguintes tipos - para a maior parte - não existem em Python em primeiro lugar. Em Python, cordas são convertidos para ints, longs ou flutuadores, porque isso é tudo que existe.

Você está pedindo para conversões que não são relevantes para Python em primeiro lugar. Aqui está a lista de tipos que você pediu e seu equivalente Python.

  • não assinados e assinados int 8 bits, int
  • não assinados e assinados int 16 bits, int
  • não assinados e assinados int 32 bits, sem assinatura: longo , assinado int
  • não assinados e assinados int 64 bits, longo

  • duplo, flutuador

  • float, flutuador
  • string, isso é o que você tinha que começar com

Eu não sei o que a seguir são, então eu não sei Python equivalente.

  • não assinado e assinado de 8 bits,
  • não assinado e assinado de 16 bits,
  • não assinado e assinado de 32 bit,
  • não assinado e assinado de 64 bits.

Você já tem todas as conversões que o assunto:. int(), long() e float()

Python tem apenas um único tipo int. Para converter uma string para um int, uso int() assim:

>>> str = '123'
>>> num = int(str)
>>> num
123

Editar:. Também se converter ao flutuador, uso float() no exatamente da mesma maneira

Eu não acho que isso pode necessariamente ser respondido bem, sem mais informações. Como já foi dito, há apenas int e longo para inteiros em python - a linguagem não aderir aos bits de largura e signedness arquétipos de linguagens de programação de nível inferior

.

Se você estiver operando completamente dentro de python, então provavelmente você está fazendo a pergunta errada. Há provavelmente uma maneira melhor de fazer o que você precisa.

Se você está interoperar com, por exemplo, o código C, ou através da rede, então há são maneiras de fazer isso, e parece que a resposta à sua postagem anterior abrangia essa avenida bonita com folga .

Eu só agora tive um problema onde eu tinha um valor passado como um 16 bits pares assinados número de complemento de Modbus. Eu precisava converter isso em um número assinado. Acabei escrevendo este, que parece funcionar bem.

# convert a 32 bit (prob) integer as though it was 
# a 16 bit 2's complement signed one
def conv_s16(i):
    if (i & 0x8000):
        s16 = -(((~i) & 0xFFFF) + 1)
    else:
        s16 = i
    return s16
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top