domingo, 12 de abril de 2015

BRINCANDO COM STRINGS - ÍNDICES E INVERSÕES


Vamos agora fazer umas 'falcatruas' com strings.

Escolhi strings por serem o resultado de muitas conversões

Vamos ao princípio básico: o índice.

>>> a='KAKAROTO'
>>> a[0]
'K'
>>> a[1]
'A'
>>> a[2]
'K'
>>> a[3]
'A'
>>> a[4]
'R'
>>> a[5]
'O'
>>> a[6]
'T'
>>> a[7]
'O'
>>> a[8]
Traceback (most recent call last):
  File "<pyshell#103>", line 1, in <module>
    a[8]
IndexError: string index out of range

Percebemos aqui então que o índice sempre começa com 0 (zero) e termina com o tamanho (lenth) -1. Ou seja, tem 8 caracteres de 0 a 7.

Aqui os escolhemos todos os índices do início [0] até [2]
>>> a[:2]
'KA'
Aqui escolhemos todos os índices maiores que dois até o fim na string
>>> a[2:]

'KAROTO'
Aqui escolhemos os quatro último índices.
>>> a[-4:]
'ROTO'
Aqui escolhemos todos os índices do início até o quarto último.
>>> a[:-4]
'KAKA'
Aqui escolhemos todos os índices, do primeiro [0] até o índice do tamanho total da string [len(a)]. O resultado é mesmo que se não especificássemos os índices, mas é de cunho didático.
>>> a[0:len(a)]

'KAKAROTO'
Aqui escolhemos do terceiro índice o tamanho total da string menos dois (total-2).
>>> a[3:len(a)-2]
'ARO'
Para entender direitinho  essa coisa de índice, veja a imagem lá em cima, ok?

Mas e se eu receber a string invertida???
Aí tem esse comando:

>>> b='ATEGEV'
>>> b[::-1]

'VEGETA'



Nossa! Que máximo!!! Ficou fácil inverter, hein? 
ÔPA! Péraí caceta! Fui inverter minha string de um resultado em HEX, deu errado!

Não se desespere! Vamos ver:

>>> h = hex(2341522)
>>> h
'0x23ba92'
>>> h[::-1]
'29ab32x0'

Realmente não deu muito certo. O que fazer?

Vamos lá.
Aqui utilizaremos uma biblioteca chamada binascii. Informações aqui e aqui.


>>> h= hex(2341522)
>>> h
'0x23ba92'
>>> h.split('x')[1]
'23ba92'
>>> h=h.split('x')[1]
>>> h
'23ba92'
>>> import binascii
>>> result=binascii.unhexlify(h[0:len(h)].encode())
>>> result
b'#\xba\x92'
>>> result[::-1]
b'\x92\xba#'
>>> result=binascii.unhexlify(h.encode())
>>> result
b'#\xba\x92'
>>> result=hexlify(result[::-1]).decode()
>>> result
'92ba23'

Vixxx Maria!!! Quanta informação!!!

Vamos com calma.
A parte do split, já vimos em um post anterior.
A parte do binascii.hexlify, transformou a string em um hexadecimal 'binário'. Daí, quando invertemos com o  [::-1], ao invés de inverter cada um dos caracteres, invertemos os bytes (conjuntos de oito bits).
A parte do binascii.unhexlify transfmormou o hexadecimal 'binário' em uma string novamente.
Tão lindo, não é?



Um comentário:

  1. Caro Emerson, boa vida!

    Há um erro na linha de comando">>> result=hexlify(result[::-1]).decode()"
    O correto seria >>> result=binascii.hexlify(result[::-1]).decode()

    Obrigado pelas dicas!

    ResponderExcluir