Hexadecimal
Sistema de numeração que usa 16 símbolos
O sistema de numeração hexadecimal usa os dígitos 0-9 e os caracteres A-F para representar os números 0-15.
Então, basicamente, o sistema hexadecimal (16 símbolos) é uma extensão do sistema decimal (10 símbolos). Isso significa que você pode representar números de 0 a 15 usando apenas um símbolo.
Esse sistema é útil para representar bytes, porque meio byte tem 16 combinações diferentes, então você pode representar um byte inteiro usando apenas 2 símbolos hexadecimais. É por isso que muitos dos dados que você vê no Bitcoin (ex.: chaves privadas, transações) estão em hexadecimal.
As letras em hexadecimal podem ser maiúsculas ou minúsculas, não faz diferença (ex.: 1337af é o mesmo que 1337AF).
Hexa = 6, Deci = 10. Então hexadecimal se refere ao fato de haver 16 caracteres diferentes neste sistema de numeração.
Hexadecimal para Decimal
Para converter hexadecimal para decimal, você multiplica cada caractere por potências crescentes de 16.
- Converta cada símbolo hexadecimal para o seu valor decimal correspondente.
- Multiplique cada um desses valores decimais (do menor para o maior) por uma potência crescente de 16 (ex.: 160, 161, 162, 163, etc.)
- Some todos os resultados para obter o valor decimal final.
Por exemplo:
Hexadecimal = 02A13B
B = 11 * 16⁰ = 11
3 = 3 * 16¹ = 48
1 = 1 * 16² = 256
A = 10 * 16³ = 40960
2 = 2 * 16⁴ = 131072
0 = 0 * 16⁵ = 0
Decimal = 0 + 131072 + 40960 + 256 + 48 + 11 = 172347
Isso parece confuso no início, mas é exatamente como o sistema decimal funciona também. Todo número em um valor decimal representa 10 a uma potência crescente (porque há 10 dígitos no sistema decimal, ou "base 10"). Por exemplo, o número 123 está dizendo (1 × 102) + (2 × 101) + (3 × 100), ou "um 100, dois 10 e três 1".
Qualquer número elevado a zero é 1. Por exemplo, 100 = 1, e 160 = 1.
Você não precisa conseguir converter hexadecimal para decimal de cabeça, mas é bom lembrar que, no fim, você está só olhando para números quando olha para dígitos e caracteres hexadecimais.
Little-Endian. A maioria dos números armazenados nos campos dos dados do bitcoin (ex.: vout, valor) está em little-endian (onde os bytes ficam em ordem inversa), então você precisa inverter a ordem dos bytes antes de converter para decimal.
Exemplos de Código
Você pode converter strings hexadecimais para decimal em qualquer boa linguagem de programação. Deve haver funções nativas que facilitam isso, então você não precisa fazer a conversão manualmente.
# hexadecimal para decimal
puts "02A13B".to_i(16) #=> 172347 # hexadecimal para decimal
echo "ibase=16; 02A13B" | bc #=> 172347 Decimal para Hexadecimal
Para converter decimal para hexadecimal, você só precisa continuar dividindo por 16.
O resto de cada divisão te dá o número de cada caractere hexadecimal (do menor para o maior). Você então pega o resultado de cada divisão (quociente) e continua até não conseguir mais dividir (ou seja, até o quociente ser zero).
Por exemplo:
Decimal = 6735
6735 / 16 = 420 (resto 15)
420 / 16 = 26 (resto 4)
26 / 16 = 1 (resto 10)
1 / 16 = 0 (resto 1)
Hexadecimal = 1A4F
Módulo. A operação de módulo (%) retorna o resto após a divisão.
Exemplos de Código
# decimal para hexadecimal
puts 6735.to_s(16) #=> 1a4f # decimal para hexadecimal
echo "obase=16; 6735" | bc #=> 1A4F Bytes
Para que serve o hexadecimal?
Você vai encontrar muitos caracteres hexadecimais ao trabalhar com dados brutos no Bitcoin. Por exemplo, aqui está uma chave privada aleatória:
f03571c4295fd246cf0babd5ffce52452567272cd8bfb4e63e5cd5d093f39f5b Essa chave privada representa 32 bytes de dados.
Por que usamos hexadecimal para mostrar bytes? Porque meio byte de dados tem 16 combinações possíveis, e há 16 caracteres hexadecimais diferentes. Portanto, podemos representar meio byte usando um único caractere hexadecimal, e um byte inteiro usando dois caracteres hexadecimais.
É uma combinação perfeita feita no céu da computação.
Por exemplo, em vez de exibir todos os oito bits individuais usando binário como 10110101, podemos encurtar para dois caracteres hexadecimais B5 (porque 1011 = B e 0101 = 5).
Então, basicamente, o sistema hexadecimal é um sistema conveniente para exibir bytes brutos de dados.