# 8 Conversion de types

list1 = ['1', '2', '3']
str1 = ''.join(list1)

str1
# '123'

list1 = [1, 2, 3]
str1 = ''.join(str(e) for e in list1)   # ou avec "" à la place de ''

str1
# '123'


a = "545.2222"
float(a)
# 545.2222      suivant le système, on peut avoir des '0' après les '2'

int(float(a))
# 545

def is_float(value):
  try:
    float(value)
    return True
  except:
    return False

# On peut aussi utiliser la prédéfinie eval() qui évalue du code Python
eval("1.5") 
# 1.5

# Une alternative plus sûre à eval()
import ast
ast.literal_eval("545.2222")
545.2222

ast.literal_eval("31")
31

# Des cas d'erreur 
eval(toto)          # toto non défini ou n'est pas un str/octes/code
ast.literal_eval(toto)
# Erreur dans les 2 cas


# Converstion en binaire
st = "hello Debase"
' '.join(format(ord(x), 'b') for x in st)
# '1101000 1100101 1101100 1101100 1101111 100000 1000100 1100101 1100010 1100001 1110011 1100101'

# Conversion de string en hexadécimal
s='Hello Debase of Ecl'
' '.join(format(ord(x), 'x') for x in s)
# '48 65 6c 6c 6f 20 44 65 62 61 73 65 20 6f 66 20 45 63 6c'

# Conversion entier en Unicode
chr(16)     # Quelle est la forme hexa de 16 ?
#'\x10'

# Conversions décimal <==> base xx

int('12',8) # Quelle est la valeur décimale du nombre octal '12' (octal car base = 8)
# 10    

int('12',16) # Quelle est la valeur décimale du nombre hexa '12' (hexa car base = 16)
# 18

int('12')   # Quelle est la valeur décimale du nombre décimale '12' (décimal car base par défaut = 10)
# 12

int('1000',2)   # Que donne le nombre binaire '1000' en décimal (binaire car base = 2)
# 8   

# Pour convertir un entier en octal

oct(12)
# '0o14'        #un 'O' au début (pour Octal)

oct(8)
# '0o10'

# Autres conversions

# octal
eval('0o010') == 10     # La valeur décimale de '0o010' est-elle 10
# False

eval('0o010')
# 8

oct(42)               # La valeur octale de l'entier 42
# '0o52'

int('0o52', 0)      # La valeur décimale de l'octale  '0o52' (si base=0 alors base est dans le string)
# 42

int('1101', 2)      # La valeur décimale du binaire '1101'  (base explicite = 2)
#13

int('0b1101', 2)    # Idem, base explicitée = 2, peut importe '0b'
#13

int('0b1101', 0)    # La valeur décimale du binaire '0b1101' (base = 0 --> la base '0b' est dans le string)
#13

from struct import *

pack('hhl', 1, 2, 3)
# b'\x01\x00\x02\x00\x00\x00\x00\x00\x03\x00\x00\x00\x00\x00\x00\x00'
# b veut dire byte (2 octes). \x veut dire hexa

pack('b', 1)
# b'\x01'

pack('b', 16) # signed char de taille 1. On convertie 16 en signed char
# b'\x10' 

In [39]: pack('B', 16)  # unsigned char de taille 1
# b'\x10'

pack('h', 1)
# b'\x01\x00'

calcsize('h')
# 2

calcsize('b')
# 1

unpack('b', b'\x10')
# (16,)

type(unpack('b', b'\x10'))
# tuple

unpack('b', b'\x10')[0]    # Première élé. Il y a virgule car taille tuple >= 2  
# 16

pack('B',65) # donne b'A'   = i.e. le caractère dont le code = 65