Como converter arquivos texto para formato binário (0 e 1) ou hexadecimal?

O comando xxd, do UNIX e do GNU/Linux pode ser usado para brincar, gerando saídas em sequências de 0 e 1. Também é usado, por hackers para alterar ou corrigir arquivos de programas em formato binário.
O comando xxd gera uma saída em hexadecimal ou hex dump a partir de um dado arquivo.
Ele pode fazer o processo contrário, também — ou seja, converter um arquivo com conteúdo em hexadecimal para o modo binário original ou texto.
binarytext-twitter-in-stream-photo
O procedimento de converter arquivos binários para hexadecimal é útil para transmitir dados naquele formato via email, de maneira segura, em formato ASCII.
Este procedimento também é útil para permitir que arquivos binários, possam ser editados em editores de texto comuns, sem sofrer danos.
Ao converter um arquivo binário para hexadecimal, é possível editá-lo com mais segurança — e depois converter de volta.
Normalmente, usam-se hex editors para isto. Mas, se você não tiver um por perto, pode usar este utilitário padrão no Unix/Linux.
Nos meus exemplos vou usar um trecho do poema ‘Não passou’, de Carlos Drummond de Andrade, dentro do meu arquivo ‘carlosdrummonddeandrade.txt’. Você pode usar qualquer outro arquivo texto, disponível no seu sistema:

cat carlosdrummonddeandrade.txt 
Não passou

(Carlos Drummond de Andrade)

Hoje somos mais vivos do que nunca.
Mentira, estarmos sós.
Nada, que eu sinta, passa realmente.
É tudo ilusão de ter passado

Para ver o texto representado em modo hexadecimal, use o xxd, sem opção alguma:

xxd carlosdrummonddeandrade.txt 
0000000: 4ec3 a36f 2070 6173 736f 750a 0a28 4361  N..o passou..(Ca
0000010: 726c 6f73 2044 7275 6d6d 6f6e 6420 6465  rlos Drummond de
0000020: 2041 6e64 7261 6465 290a 0a48 6f6a 6520   Andrade)..Hoje 
0000030: 736f 6d6f 7320 6d61 6973 2076 6976 6f73  somos mais vivos
0000040: 2064 6f20 7175 6520 6e75 6e63 612e 0a4d   do que nunca..M
0000050: 656e 7469 7261 2c20 6573 7461 726d 6f73  entira, estarmos
0000060: 2073 c3b3 732e 0a4e 6164 612c 2071 7565   s..s..Nada, que
0000070: 2065 7520 7369 6e74 612c 2070 6173 7361   eu sinta, passa
0000080: 2072 6561 6c6d 656e 7465 2e0a c389 2074   realmente.... t
0000090: 7564 6f20 696c 7573 c3a3 6f20 6465 2074  udo ilus..o de t
00000a0: 6572 2070 6173 7361 646f 0a              er passado.

Se preferir, você pode jogá-lo para dentro de outro arquivo. Para isto, informe o nome do arquivo de entrada seguido do nome do arquivo de saída:

xxd carlosdrummonddeandrade.txt carlosdrummonddeandrade.hex
cat carlosdrummonddeandrade.hex
0000000: 4ec3 a36f 2070 6173 736f 750a 0a28 4361  N..o passou..(Ca
0000010: 726c 6f73 2044 7275 6d6d 6f6e 6420 6465  rlos Drummond de
0000020: 2041 6e64 7261 6465 290a 0a48 6f6a 6520   Andrade)..Hoje 
0000030: 736f 6d6f 7320 6d61 6973 2076 6976 6f73  somos mais vivos
0000040: 2064 6f20 7175 6520 6e75 6e63 612e 0a4d   do que nunca..M
0000050: 656e 7469 7261 2c20 6573 7461 726d 6f73  entira, estarmos
0000060: 2073 c3b3 732e 0a4e 6164 612c 2071 7565   s..s..Nada, que
0000070: 2065 7520 7369 6e74 612c 2070 6173 7361   eu sinta, passa
0000080: 2072 6561 6c6d 656e 7465 2e0a c389 2074   realmente.... t
0000090: 7564 6f20 696c 7573 c3a3 6f20 6465 2074  udo ilus..o de t
00000a0: 6572 2070 6173 7361 646f 0a              er passado.

Como converter o arquivo para modo binário

Para ver a saída no modo binário, em vez de hexadecimal, use a opção ‘-b’.
Esta opção altera a formatação da saída para binary digits ou dígitos binários — ele reescreve o conteúdo do texto em octetos de zeros e uns.
Veja um exemplo:

xxd -b carlosdrummonddeandrade.txt 
0000000: 01001110 11000011 10100011 01101111 00100000 01110000  N..o p
0000006: 01100001 01110011 01110011 01101111 01110101 00001010  assou.
000000c: 00001010 00101000 01000011 01100001 01110010 01101100  .(Carl
0000012: 01101111 01110011 00100000 01000100 01110010 01110101  os Dru
0000018: 01101101 01101101 01101111 01101110 01100100 00100000  mmond 
000001e: 01100100 01100101 00100000 01000001 01101110 01100100  de And
0000024: 01110010 01100001 01100100 01100101 00101001 00001010  rade).
000002a: 00001010 01001000 01101111 01101010 01100101 00100000  .Hoje 
0000030: 01110011 01101111 01101101 01101111 01110011 00100000  somos 
0000036: 01101101 01100001 01101001 01110011 00100000 01110110  mais v
000003c: 01101001 01110110 01101111 01110011 00100000 01100100  ivos d
0000042: 01101111 00100000 01110001 01110101 01100101 00100000  o que 
0000048: 01101110 01110101 01101110 01100011 01100001 00101110  nunca.
000004e: 00001010 01001101 01100101 01101110 01110100 01101001  .Menti
0000054: 01110010 01100001 00101100 00100000 01100101 01110011  ra, es
000005a: 01110100 01100001 01110010 01101101 01101111 01110011  tarmos
0000060: 00100000 01110011 11000011 10110011 01110011 00101110   s..s.
0000066: 00001010 01001110 01100001 01100100 01100001 00101100  .Nada,
000006c: 00100000 01110001 01110101 01100101 00100000 01100101   que e
0000072: 01110101 00100000 01110011 01101001 01101110 01110100  u sint
0000078: 01100001 00101100 00100000 01110000 01100001 01110011  a, pas
000007e: 01110011 01100001 00100000 01110010 01100101 01100001  sa rea
0000084: 01101100 01101101 01100101 01101110 01110100 01100101  lmente
000008a: 00101110 00001010 11000011 10001001 00100000 01110100  .... t
0000090: 01110101 01100100 01101111 00100000 01101001 01101100  udo il
0000096: 01110101 01110011 11000011 10100011 01101111 00100000  us..o 
000009c: 01100100 01100101 00100000 01110100 01100101 01110010  de ter
00000a2: 00100000 01110000 01100001 01110011 01110011 01100001   passa
00000a8: 01100100 01101111 00001010                             do.

Se você prefere uma solução mais limpa, use a seguinte expressão:

xxd -b -g0 carlosdrummonddeandrade.txt | cut -d' ' -f2
010011101100001110100011011011110010000001110000
011000010111001101110011011011110111010100001010
000010100010100001000011011000010111001001101100
011011110111001100100000010001000111001001110101
011011010110110101101111011011100110010000100000
011001000110010100100000010000010110111001100100
011100100110000101100100011001010010100100001010
000010100100100001101111011010100110010100100000
011100110110111101101101011011110111001100100000
011011010110000101101001011100110010000001110110
011010010111011001101111011100110010000001100100
011011110010000001110001011101010110010100100000
011011100111010101101110011000110110000100101110
000010100100110101100101011011100111010001101001
011100100110000100101100001000000110010101110011
011101000110000101110010011011010110111101110011
001000000111001111000011101100110111001100101110
000010100100111001100001011001000110000100101100
001000000111000101110101011001010010000001100101
011101010010000001110011011010010110111001110100
011000010010110000100000011100000110000101110011
011100110110000100100000011100100110010101100001
011011000110110101100101011011100111010001100101
001011100000101011000011100010010010000001110100
011101010110010001101111001000000110100101101100
011101010111001111000011101000110110111100100000
011001000110010100100000011101000110010101110010
001000000111000001100001011100110111001101100001
011001000110111100001010

Use o gstreamer para fazer resampling de arquivos mp3 no Ubuntu

É possível reduzir ainda mais os tamanhos dos arquivos mp3, com pouca perda da qualidade. A utilidade deste procedimento é fazer com que uma quantidade maior deles caiba em dispositivos reprodutores antigos, com capacidade de armazenamento muito limitada.
Se você não se importa em ouvir toda a sua coleção de músicas em um dispositivo de som, com qualidade de rádio, esta é uma ótima ideia.

iPods mp3 player
Coleção de iPods

No primeiro post sobre este tema mostramos como fazer este trabalho através do LAME.
É claro que a redução tem um custo — a consequente redução da qualidade do áudio do arquivo. A gente aposta na possibilidade de esta queda na qualidade ser imperceptível para a maioria das pessoas e no aproveitamento mais eficiente do espaço na mídia de armazenamento. Houve caso de triplicar a quantidade de arquivos dentro de um pendrive antigo.
Atualmente, temos outras ferramentas que também podem fazer o trabalho e é possível criar um script de automação da tarefa bem menor e mais enxuto do que o do artigo anterior.
Vamos ver aqui como isto é possível.

Instalação das ferramentas de trabalho

Aqui vamos usar o GStreamer para fazer a conversão e resampleamento (resampling) dos arquivos mp3. A principal vantagem dele, em relação ao LAME, é que ele retém as informações id3 dos arquivos. Assim, podemos fazer um único script e menor.
Abra um terminal (Ctrl + Alt + T, no Ubuntu) e digite o comando que segue, para instalar gstreamer-tools:

sudo apt-get install gstreamer-tools

Aguarde alguns minutos enquanto o pacote é instalado e prossiga.

Como criar um script de conversão de arquivos de áudio mp3

Sugiro criar um diretório para scripts e programas no seu /home:

mkdir ~/bin
cd ~/bin

Agora abra o seu editor de textos preferido, copie e cole o script abaixo dentro dele:

#!/bin/bash
#
# gshrink - Um script para resamplear todos os arquivos mp3 do
# diretorio. Este script depende do pacote gstremar-tools
# Os créditos do script original:
# Elder-Geek --> http://elder-geek.blogspot.com.br
######################################################
# Lita os arquivos mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list
# Analisa a lista de arquivos mp3 e substitui os espaços por caracteres de escape
sed -i 's: :\\ :g' mp3_list
# Verifica se o subdiretorio resample já existe. Se não, cria.
if
  test -e ./resample
then
  echo "diretorio/arquivo resample ja existe - apagar? (S/n)"
  read reply
  if
    [ "$reply" != "n" ]
  then
    rm -r resample
    mkdir resample
  else
    exit
  fi
else
  mkdir resample
fi
# Resampleia cada mp3 e grava as tags
# CBR bitrate bitrate=128
# VBR quality quality=9
  cat mp3_list |while read song
do
  echo "$song"
  gst-launch filesrc location= \"$song\" ! decodebin2 ! audioconvert ! lamemp3enc target=bitrate bitrate=128 ! id3v2mux ! filesink location=\"resample/$song\"
done
#clean up
if
  test -e mp3_list
then
  rm mp3_list
fi
if
  test -e tag2.txt
then
  rm tag2.txt
fi
exit

Uma última dica

Para quem fez backup de todos os seus CD’s e guardou cada coletânea e álbum em pastas diferentes, recomendo executar o script dentro de cada pasta de arquivos mp3 – o que vai criar um subdiretório adicional resample com os mesmos arquivos da pasta pai, só que resampleados e reduzidos, prontos para ir pra qualquer lugar.

Como reduzir o tamanho do arquivo de audio mp3

O caso aqui é o de reaproveitar todo e qualquer aparelho reprodutor de mp3, ou cartões de memória velhos e, sobretudo, com espaço para armazenamento muito limitado. Eu, mesmo, tinha um pendrive “guerreiro” de 256 Mb, que devia estar próximo dos 7 anos de uso — simplesmente não lembro de quando o comprei. Mas funciona bem em uma caixa de som com entrada USB.
Recentemente, converti uma coleção inteira de CDs para mp3, como cópia de segurança. Agora, para ouvir no dia a dia, não preciso de arquivos de 320 kbps – 128 kbps, ou menos, podem ser o suficiente.

MP3 Logo
MP3 Logo

Se você tem um iPod ou celular antigo, com espaço insuficiente para armazenar músicas, fazer um downsampling nelas pode ser uma solução — é possível triplicar a quantidade de músicas que cabem no dispositivo.
OBS.:A segunda parte deste artigo ensina a fazer esta tarefa com o gstreamer-tools.

Ferramentas necessárias para reduzir o tamanho do arquivo mp3

Os aplicativos necessários para realizar esta tarefa são o python-mutagen e o lame. Ambos podem ser baixados e usados livremente.
No Ubuntu, você pode instalar os dois primeiros via terminal (Ctrl + Alt + T), assim:

sudo apt-get install lame python-mutagen

Como converter os arquivos mp3

Você deve ter centenas de arquivos para converter, não apenas um, eu sei… — mas eu quero mostrar como tudo funciona. Sinta-se livre para pular esta parte, se quiser, apressadinho(a). 😉
Dentro do terminal aberto, digite o seguinte comando para resamplear a sua música (adapte o comando à sua situação, substituindo os nomes dos arquivos):

lame -V5 --vbr-new --resample 44.1 arquivo_original.mp3 arquivo_resampleado.mp3

Aguarde alguns intantes, enquanto os arquivos são processados e, depois, compare os tamanhos.

reduzir o tamanho do mp3
Clique para ampliar a tela

Depois de concluído o trabalho, verifique os tamanhos dos arquivos.
Parece que vai dar pra reviver o antigo cartão de memória, ou não?
Como resamplear arquivos mp3
Clique para ampliar

Problemas que você pode ter com a conversão

Temos dois problemas com este método, por mais eficiente que ele seja:

  • O LAME não copia as tags id3 pro arquivo de origem — em outras palavras, na hora em que estiver tocando, o display do seu aparelho não vai mostrar as informações da música (nome, cantor, álbum etc) – o que pode ser um problema menor para quem vai tocá-las em um aparelho sem visor;
  • Como eu imagino que você tenha centenas de músicas para converter, todo este trabalho braçal não tem sentido.

Como converter muitos arquivos mp3

Para fazer o resampling de uma quantidade brutal de arquivos, o ideal é usar um script.
O Linerd do TuxTweaks, ensina a montar um este script que automatiza a nossa tarefa.
Em verdade, vos digo que serão 2 scripts. O primeiro lê todos os arquivos do diretório a partir do qual está sendo executado e os repassa pro segundo script, que faz o resampling e copia as tags id3. Todos os arquivos do diretório atual serão copiados para um segundo, chamado resample, criado pelo script.
A recomendação, aqui, é que você crie uma pasta (diretório) só para scripts e programas seus:

mkdir ~/bin
cd ~/bin

Copie o texto do script abaixo e cole-o dentro do seu editor de textos preferido. Salve-o como mp3shrink dentro do diretório criado para isto ~/bin

#!/bin/bash
#
# mp3shrink - Um script para resamplear todos os arquivos mp3
# em um diretorio. Este script chama o cptag que precisa
# estar no diretorio do mp3shrink. O cptag depende do lame
# e do mid3v2 (mid3v2 se encontra no pacote do python-mutagen
# É aconselhavel que os scripts fiquem no diretório  
# ~/bin.
######################################################

# Lita os mp3 no diretorio atual
ls *.mp3 > mp3_list
ls *.MP3 >> mp3_list

# Analisa os arquivos mp3 e substitui os espaços em branco por barras de escape.
sed -i 's: :\\ :g' mp3_list

# Verifica a existencia do diretorio resample. Cria um se nao existir
if
   test -e ./resample
then
   echo "diretorio/arquivo resample ja existe. deseja remover? (S/n)"
   read reply
   if
     [ "$reply" != "n" ]
   then
     rm -r resample
     mkdir resample
   else
     exit
   fi
else
   mkdir resample
fi

# Resampleia cada arquivo mp3 e grava as tags atraves do script cptag
cat mp3_list |while read song
do
   echo "$song"
   ~/bin/cptag "$song"
done

# fazendo a limpeza .... 
if
   test -e mp3_list
then
   rm mp3_list
fi
if
   test -e tag2.txt
then
   rm tag2.txt
fi
exit

Feito isto, crie o arquivo cptag, também dentro do diretório ~/bin. Segue o código:

#!/bin/bash
#
#cptag - Um script que resampleia arquivos mp3 com o LAME
#        e copia as tags id3v2 do original pro novo.
#
#####################

# Le as tags id3 e grava no arquivo
mid3v2 -l "$1" > tag2.txt

# Resampleia o arquivo de audio

lame -V5 --vbr-new --resample 44.1 "$1" "resample/$1"

# ajusta o valor da variavel 'title'
if
   grep TIT2= tag2.txt > /dev/null  #testa se a tag title existe
then
   title=`grep TIT2= tag2.txt | sed "s:TIT2=::"`
   echo $title
else
   echo "A tag title nao existe."
fi

# Ajusta a variavel 'album'
if
   grep TALB= tag2.txt > /dev/null  #testa se a tag album existe
then
   album=`grep TALB= tag2.txt | sed "s:TALB=::"`
   echo $album
else
   echo "A tag album nao existe."
fi

# Ajusta a variavel 'artista'
if
   grep TPE1= tag2.txt > /dev/null  #Testa se a tag artista existe
then
   artist=`grep TPE1= tag2.txt | sed "s:TPE1=::"`
   echo $artist
else
   echo "A tag artista nao existe."
fi

# Ajusta o valor da variavel 'track'
if
   grep TRCK= tag2.txt > /dev/null  # Testa se a tag track existe
then
   track=`grep TRCK= tag2.txt | sed "s:TRCK=::"`
   echo $track
else
   echo "A tag track nao existe."
fi

# Ajusta a variavel 'genre'
if
   grep TCON= tag2.txt > /dev/null  # Testa se a taf genre exsite
then
   genre=`grep TCON= tag2.txt | sed "s:TCON=::"`
   echo $genre
else
   echo "A tag genre nao existe."
fi

# Grava as tags no arquivo
mid3v2 -t "$title" -A "$album" -a "$artist" -T "$track" -g "$genre" "resample/$1"

exit

Agora, você precisa tornar estes dois scripts executáveis:

cd ~/bin
chmod u+x mp3shrink cptag

Feito!
Agora vá para o diretório em que se encontram todos os mp3 que você deseja resamplear e execute:

mp3shrink

O script vai guardar os novos arquivos em um subdiretório chamado resample. Dê uma olhada!
Divirta-se!

Altere as cores dos nomes dos diretórios, no terminal

Esta não é uma dica que exija algum conhecimento avançado de Linux, embora seja voltado para quem usa o terminal para executar alguns comandos — especialmente se for pra ver os conteúdos dos diretórios.
O problema aqui é que os nomes dos diretórios, quando coloridos, costumam vir em azul escuro – o que é ótimo para quem usa um terminal, como o xterm, com o fundo branco.
Mas atrapalha a visibilidade para quem usa um tema de fundo escuro no console.
No Ubuntu, o aplicativo de terminal padrão tem fundo preto, o que dificulta a leitura de letras azul escuro ou, azul com fundo verde (o que depende das permissões destes diretórios).
Captura de tela de 2013-02-07 22:31:10
Neste post vou mostrar como alterar a cor das letras dos nomes dos diretórios para amarelo claro — mas você pode experimentar e optar por outras colorações.
Readéque os exemplos à sua preferência.

  1. Abra o arquivo ~/.bashrc com o seu editor favorito
  2. Inclua ao final do arquivo o seguinte código:
    LS_COLORS='di=1;33';export LS_COLORS
    # altera a cor de exibição dos nomes de diretórios para amarelo forte.

Caso você não goste muito desta opção de cor (1;33), há outras, como você pode ver abaixo.

  • Azul = 34
  • Verde = 32
  • Verde Claro = 1;32
  • Ciano = 36 — usada para exibição de links
  • Vermelho = 31
  • Púrpura = 35
  • Marrom = 33
  • Amarelo = 1;33
  • Branco = 1;37
  • Cinza Claro = 0;37
  • Preto = 30
  • Cinza escuro = 1;30

O primeiro número determina a intensidade ou a variação da cor:

  • 0 — nenhuma
  • 1 — negrito
  • 2 — normal
  • 3 — clareado
  • 4 — sublinhado

O valor após o ponto e vírgula (;) determina a cor a ser usada.
Depois de feitas, as alterações só terão efeito depois de reiniciar a sessão.

Como ver as alterações no console sem reiniciar a sessão

Vamos simplificar as coisas a ponto de bastar iniciar um novo terminal (Ctrl+Alt+T) para ver as alterações.
Para isto, é necessário incluir a linha if [ -f ~/.bashrc ]; then . ~/.bashrc; fi no arquivo .bash_profile:

echo "if [ -f ~/.bashrc ]; then . ~/.bashrc; fi" >> ~/.bash_profile
# Este codigo pode ser removido quando os ajustes de lscolors estiverem finalizados.

Leia mais sobre o LS_COLORS aqui.
Toda vez que você abrir um novo terminal (ou shell), o .bash_profile, presente no seu diretório home, é executado. A linha, que incluímos força a leitura adicional do arquivo de configuração .bashrc seja lido.

Use wput to send files through the network

You don’t have to open up your FTP client (whatever it is) to connect to the server when all you want is upload a single file or a bunch of directories.
Using wput is simple and very efficient when you want to do send files through FTP connections.
Ubuntu or Debian users can install wput using the apt-get command:

sudo apt-get install wput

Fedora users can do it with yum:

sudo yum install wput

And there’s a Windows version on sourceforge.
network connections

wput command syntax

To send all files from a local directory to the remote FTP server the syntax would be something like this:

wput *.* ftp://username:password@hostname/recipient-folder/

In the following examples I’ll assume my username is slinkydog and my password is dachshund. My server address would be toystoryfun.com (I didn’t check if it exists and it doesn’t matter. Use your own server names here). The recipient folder in the server will be called characters/.
This is the first example on how to send a single file through your FTP connection:

wput filename.txt ftp://slinkydog:dachshund@toystoryfun.com/characters/

How to deal with wput verbosity

You can reduce the verbosity, using --less-verbose option:

wput --less-verbose filename.txt ftp://slinkydog:dachshund@toystoryfun.com/characters/

You can use the option --verbose to increase the command output even more or the option quit to simply suppress verbosity.
I usually prefer to send wput to work in the background which sets my terminal free to run other stuffs. This is how to do it:

wput --background *.* ftp://slinkydog:dachshund@toystoryfun.com/characters/

If you wantto know what’s happening (or happened) during the transference just read the file ./wputlog:

less ./wputlog

How to limit the bandwidth usage while sending files with wput

The option --limit-rate can be used to limit the average use of your network bandwidth. In the following example I’ll limit it to 500 K:

wput --limit-rate=500K --less-verbose about.php index.php styles.css ftp://slinkydog:dachshund@toystoryfun.com/characters/

In the example above I limited the average rate of bandwidth usage to 500 K, decreased verbosity level and told wput to transfer the files:

  • about.php
  • index.php
  • styles.css

You can use wildcards like *.php if you want.

How to resume incomplete uploads with wput

Wput resumes incomplete transfers by default. So you don’t need to do anything special here.
Though you can force it to do it all again by telling the program to reupload:

wput --reupload --less-verbose --limit-rate=1M *.php *.css *.html ftp://slinkydog:dachshund@toystoryfun.com/characters/

Take a look at the man page of the command to see more options:

man wput

… and have fun!