Um byte tem 8 bits. Como o hex usa 16 caracteres, 0-9a-f, ele pode exibir apenas quatro bits por caractere. São necessários dois caracteres hexadecimais para exibir um byte. Adicione a isso que a maioria dos caracteres na exibição hexadecimal possui um espaço depois deles e você verá porque a exibição hexadecimal leva até três vezes mais bytes que o binário arquivo.
Exemplo
Vamos criar um arquivo contendo um único byte:
$ printf 'a' >afile
$ wc afile
0 1 1 afile
Agora, vamos exibi-lo com, por exemplo, hexdump -C
:
$ hexdump -C afile
00000000 61 |a|
00000001
O caractere a
é o caractere ASCII 61
(hex). O único byte no arquivo leva dois caracteres para exibir em hexadecimal (e três se o hexadecimal tiver um espaço após ele).