Mais sobre binário

Vamos ver quem pode me ajudar com isso. Quer converter uma string ASCII para binário. É um problema relativamente simples. Em python[bb], resolvi assim:

def toBin(intNum):
s=""
for i in [2 ** (7-n) for n in range(8)]:
s+={True:"1",False:"0"}[intNum>=i]
intNum=intNum%i
return s
print " ".join([toBin(ord(i)) for i in list("Teste")])

Não sei se é uma solução elegante, mas como fiz em menos de dois minutos, fiquei com essa mesmo. Existe um jeito mais prático? Um módulo que faça isso? E em outra linguagem?

(Não, eu não programo em binário 😉 )

Publicado por

Elcio

Elcio é sócio fundador da Visie Padrões Web. Pioneiro no uso e divulgação dos padrões do W3C no Brasil, Elcio já treinou equipes de dezenas de empresas como Globo.com, Terra, Petrobras, iG e Locaweb. Além disso, tem dirigido as equipes da Visie no desenvolvimento de projetos web para marcas como Brastemp, Itaú Unibanco, Johnson & Johnson e Rede Globo.

15 comentários em “Mais sobre binário”

  1. Oi, tenho uma dúvida. Sou programador, porém, desatualizado, e não mexo em binário.
    Na verdade quero saber como eu devo fazer para transg=formar fotos que não sei como transformei-as em bin, e agora eu quero reverter.

    grato.

  2. Bom é quando existe suporte nativo a essas coisas, como ocorre em JS:
    var c = [], s = ‘teste’;
    for(var p in s) c[c.length] = s.charCodeAt(p).toString(2);
    alert(c);

    só testei em ‘8-bit char’, já em unicode talvez dê piti.

  3. em C eu fiz uma classe q converte int para string binaria… lembrando q um char é um int de 8 bits(ASCII)


    #include "vcl\vcl.h"
    #include "string.h"
    #pragma hdrstop

    class TBinario {

    public:
    char * __fastcall IntToStrBin(unsigned short int num);
    };
    //---------------------------------------------------------------------------
    char * __fastcall TBinario::IntToStrBin(unsigned short int num)
    {
    unsigned short int BYTE[8] = {
    0x01,0x02,0x04,0x08,
    0x10,0x20,0x40,0x80
    };

    unsigned short int cont,bit=7;
    static char buf[10]; //para armazenar a string de números binários.
    for( cont = 0; cont

  4. em C eu fiz uma classe q converte int para string binaria… lembrando q um char é um int de 8 bits(ASCII)

    #include “vcl\vcl.h”
    #include “string.h”
    #pragma hdrstop

    class TBinario {

    public:
    char * __fastcall IntToStrBin(unsigned short int num);
    };
    //—————————————————————————
    char * __fastcall TBinario::IntToStrBin(unsigned short int num)
    {
    unsigned short int BYTE[8] = {
    0x01,0x02,0x04,0x08,
    0x10,0x20,0x40,0x80
    };

    unsigned short int cont,bit=7;
    static char buf[10]; //para armazenar a string de números binários.
    for( cont = 0; cont

  5. Tentando arrumar um jeito de mostrar a indentação… culpa do Python! 🙂
    def to_bin(num, padding = 8 ):
    _ result = []
    _ remainder = num
    _ while remainder:
    _ _ result.append(’01′[remainder % 2])
    _ _ remainder //= 2
    _ return ”.join(result[::-1]).rjust(padding, ‘0’)

  6. Élcio, talvez isso seja muito “pegar no pé”, mas sua função tem os problemas de performance de concatenação sucessiva de strings e recriar o dict a cada iteração… não que isso deva trazer qualquer efeito num código pra uso momentâneo.

    Eu tenho uma pequena biblioteca pessoal de funções, e nela tem uma função pra conversão pra bases arbitrárias. Simplificando e reduzindo o código pra base 2, ficaria assim:
    def to_bin(num, padding = 8):
    result = []
    remainder = num
    while remainder:
    result.append('01'[remainder % 2])
    remainder //= 2
    return ''.join(result[::-1]).rjust(padding, '0')

    Poderia ser feito também usando operadores de bits, mas acho que seria complicação à toa aqui.

  7. Tinha feito uma função recursiva em C na faculdade para resolver o problema de converter para binário, lembrando da idéia apenas deixei em código php, mas pode ser utilizado em qualquer linguagem.


    function toBin($num) {
    if ( $num > 0 ):
    $divisao = ( int ) ( $num / 2 );
    $resto = ( $num % 2 );
    toBin($divisao);
    echo $resto;
    endif;
    }

    Abraços

  8. Em Ruby:

    "Teste".unpack("c*").map {|c| c.to_s(2).rjust(8,"0")}.join(" ")

    Resultado:

    "01010100 01100101 01110011 01110100 01100101"

    Se você usar direto, pode inserir um método to_bin em toda String, onde ela te retorna um array com os binários:

    class String
    def to_bin
    self.unpack("c*").map {|c| c.to_s(2).rjust(8,"0")}
    end
    end

    s1 = "oi"
    s2 = "Elcio"
    p s1.to_bin
    p s2.to_bin

    Resultado:

    [taq@~/code/ruby]ruby str_bin.rb
    ["01101111", "01101001"]
    ["01000101", "01101100", "01100011", "01101001", "01101111"]

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *