translating ascii to binary

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • Canned

    translating ascii to binary

    Hi,
    I'm trying to write a class that can convert ascii to binary and vice
    versa. I write my class based on this function I've found on internet
    def ascii_to_bin(ch ar):
    ascii = ord(char)
    bin = []
    >
    while (ascii 0):
    if (ascii & 1) == 1:
    bin.append("1")
    else:
    bin.append("0")
    ascii = ascii >1
    >
    bin.reverse()
    binary = "".join(bin )
    zerofix = (8 - len(binary)) * '0'
    >
    return zerofix + binary
    >
    >
    >
    some_string = 'Time to go now, Rummy?'
    >
    binary = []
    for char in some_string:
    binary.append(a scii_to_bin(cha r))
    >
    print binary
    print " ".join(bina ry)
    That works perfectly, but when I try to implement it in my own class it
    gives me alot of headache, also because I'm totally new to the language.
    It work only with one character at a time, and if I give a string it
    just give some weird result.
    if len(sys.argv) < 2:
    print 'usage:', os.path.basenam e(sys.argv[0]), 'text'
    sys.exit()
    >
    class Converterab:
    '''
    Ascii-binary converter.
    '''
    def __init__(self, string):
    self.string = string
    >
    def ascii_to_bin(se lf):
    bindump = []
    for char in self.string:
    bin = ord(char)
    while bin 0:
    if (bin & 1) == 1:
    bindump.append( "1")
    else:
    bindump.append( "0")
    bin = bin >1
    bindump.reverse ()
    print bindump # Debug tool, delete this
    >
    '''
    Zero fix in bindump
    '''
    bindump.insert( 0, "0")
    count = 0
    pos = 0
    for dg in bindump:
    count += 1
    pos += 1
    if count == 8:
    bindump.insert( pos, "0")
    count = 0
    bindump.pop()
    print bindump # Debug tool, delete this, the best result so far
    >
    '''
    Reversing array per byte
    '''
    final = []
    pos -= pos # Set pos to 0 again
    while len(bindump) != 0:
    print count # Debug tool, delete this, this is weird, start at 1, I expected 0
    count += 1
    if count 8:
    pos += 8
    count -= count
    final.insert(po s, bindump.pop())
    print final # Debug tool, delete this
    '''
    for ar in bindump:
    count += 1
    if (count < 8):
    final.insert(po s, bindump.pop())
    elif (count >= 8):
    pos = count
    final.insert(po s, bindump.pop())
    else:
    final.insert(po s, bindump.pop())
    '''
    final.insert(0, final.pop())
    >
    binary = "".join(fin al)
    return binary
    >
    result = Converterab(sys .argv[1])
    >
    print "Char : ", result.ascii_to _bin()
    The problem start at "Reversing array per byte". That block should
    reversing the array from 'bindump' and copy it to 'final' per 8 items,
    e.g. a = ['0', '1', '0', '1', '0', '1', '0', '1', '2', '1', '2', '1',
    '2', '1', '2', '1', '3', '2', '3', '2', '3', '2', '3', '2']
    b = ['3', '2', '3', '2', '3', '2', '3', '2', '2', '1', '2', '1', '2',
    '1', '2', '1', '0', '1', '0', '1', '0', '1', '0', '1']

    Any advice about this matter would be very appreciated.
    Thanks in advance.

    C
  • Lie

    #2
    Re: translating ascii to binary

    On Sep 17, 11:02 pm, Canned <u...@domain.in validwrote:
    Hi,
    I'm trying to write a class that can convert ascii to binary and vice
    versa. I write my class based on this function I've found on internet
    >
    >
    >
    >
    >
    def ascii_to_bin(ch ar):
    ascii = ord(char)
    bin = []
    >
    while (ascii 0):
    if (ascii & 1) == 1:
    bin.append("1")
    else:
    bin.append("0")
    ascii = ascii >1
    >
    bin.reverse()
    binary = "".join(bin )
    zerofix = (8 - len(binary)) * '0'
    >
    return zerofix + binary
    >
    some_string = 'Time to go now, Rummy?'
    >
    binary = []
    for char in some_string:
    binary.append(a scii_to_bin(cha r))
    >
    print binary
    print " ".join(bina ry)
    >
    That works perfectly, but when I try to implement it in my own class it
    gives me alot of headache, also because I'm totally new to the language.
    It work only with one character at a time, and if I give a string it
    just give some weird result.
    >
    >
    >
    >
    >
    if len(sys.argv) < 2:
            print 'usage:', os.path.basenam e(sys.argv[0]), 'text'
            sys.exit()
    >
    class Converterab:
            '''
            Ascii-binary converter.
            '''
            def __init__(self, string):
                    self.string = string
    >
            def ascii_to_bin(se lf):
                    bindump = []
                    for char in self.string:
                            bin = ord(char)
                            while bin 0:
                                    if (bin& 1) == 1:
                                           bindump.append( "1")
                                    else:
                                           bindump.append( "0")
                                    bin =bin >1
                    bindump.reverse ()
                    print bindump   # Debug tool, delete this
    >
                    '''
                    Zero fix in bindump
                    '''
                    bindump.insert( 0, "0")
                    count = 0
                    pos = 0
                    for dg in bindump:
                            count += 1
                            pos += 1
                            if count == 8:
                                    bindump..insert (pos, "0")
                                    count = 0
                    bindump.pop()
                    print bindump   # Debug tool, delete this, the best result so far
    >
                    '''
                    Reversing array per byte
                    '''
                    final = []
                    pos -= pos      # Set pos to 0 again
                    while len(bindump) != 0:
                            print count     # Debug tool, delete this, this is weird, start at 1, I expected 0
                            count += 1
                            if count 8:
                                    pos += 8
                                    count -= count
                            final.insert(po s, bindump.pop())
                            print final     # Debug tool, delete this
                    '''
                    for ar in bindump:
                            count += 1
                            if (count < 8):
                                    final.insert(po s, bindump.pop())
                            elif (count >= 8):
                                    pos =count
                                    final.insert(po s, bindump.pop())
                            else:
                                    final.insert(po s, bindump.pop())
                    '''
                    final.insert(0, final.pop())
    >
                    binary = "".join(fin al)
                    return binary
    >
    result = Converterab(sys .argv[1])
    >
    print "Char : ", result.ascii_to _bin()
    >
    The problem start at "Reversing array per byte". That block should
    reversing the array from 'bindump' and copy it to 'final' per 8 items,
    e.g. a = ['0', '1', '0', '1', '0', '1', '0', '1', '2', '1', '2', '1',
    '2', '1', '2', '1', '3', '2', '3', '2', '3', '2', '3', '2']
    b = ['3', '2', '3', '2', '3', '2', '3', '2', '2', '1', '2', '1', '2',
    '1', '2', '1', '0', '1', '0', '1', '0', '1', '0', '1']
    >
    Any advice about this matter would be very appreciated.
    Thanks in advance.
    It'd be easier to make a one-char version of ascii2bin then make the
    string version based on the one-char version.

    Comment

    • Fredrik Lundh

      #3
      Re: translating ascii to binary

      Lie wrote:
      >Any advice about this matter would be very appreciated.
      >Thanks in advance.
      >
      It'd be easier to make a one-char version of ascii2bin then make the
      string version based on the one-char version.
      And it'd be a lot easier to read your posts if you trimmed away at least
      some of the original message before posting. If you cannot do that for
      some technical reason, I recommend using top-posting instead.

      </F>

      Comment

      • Steven D'Aprano

        #4
        Re: translating ascii to binary

        On Wed, 17 Sep 2008 18:02:15 +0200, Canned wrote:
        Hi,
        I'm trying to write a class that can convert ascii to binary and vice
        versa. I write my class based on this function I've found on internet
        [...]
        That works perfectly, but when I try to implement it in my own class it
        gives me alot of headache, also because I'm totally new to the language.
        It work only with one character at a time, and if I give a string it
        just give some weird result.

        [snip code]

        Your "ascii_to_b in" method tries to do too much in one method. You should
        split the functionality into small, self-contained pieces, then combine
        them. And frankly, once you got to the part where you started popping and
        inserting, my brain melted. You are making an easy job too hard! *smiles*

        Try this instead:

        class Converterab:
        '''
        Ascii-binary converter.
        '''
        def __init__(self, string):
        self.string = string
        def bin(self, n):
        """Return the binary representation of a positive integer n."""
        bindump = []
        while n 0:
        bindump.append( str(n & 1))
        n = n >1
        bindump.reverse ()
        if bindump:
        return ''.join(bindump )
        else:
        return '0'
        def char_to_bin(sel f, c):
        """Return the binary representation of a character c."""
        bits = self.bin(ord(c) )
        zeroes = "0" * (8-len(bits))
        return zeroes+bits
        def ascii_to_bin(se lf):
        results = []
        for c in self.string:
        results.append( self.char_to_bi n(c))
        return ''.join(results )



        --
        Steven

        Comment

        • Canned

          #5
          Re: translating ascii to binary

          Steven D'Aprano schreef:
          Your "ascii_to_b in" method tries to do too much in one method. You should
          split the functionality into small, self-contained pieces, then combine
          them. And frankly, once you got to the part where you started popping and
          inserting, my brain melted. You are making an easy job too hard! *smiles*
          >
          It's a bad habit, I can't help it. From now on, I'll follow your advice
          to split the functionality into small, self-contained pieces. That
          popping and inserting is just a workaround for another workaround.
          Try this instead:
          >
          class Converterab:
          '''
          Ascii-binary converter.
          '''
          def __init__(self, string):
          self.string = string
          def bin(self, n):
          """Return the binary representation of a positive integer n."""
          bindump = []
          while n 0:
          bindump.append( str(n & 1))
          n = n >1
          bindump.reverse ()
          if bindump:
          return ''.join(bindump )
          else:
          return '0'
          def char_to_bin(sel f, c):
          """Return the binary representation of a character c."""
          bits = self.bin(ord(c) )
          zeroes = "0" * (8-len(bits))
          return zeroes+bits
          def ascii_to_bin(se lf):
          results = []
          for c in self.string:
          results.append( self.char_to_bi n(c))
          return ''.join(results )
          >
          I've spend 3 days to find out what did I do wrong, but you did it in
          just half an hour/more. You're my hero.

          Comment

          • Lie

            #6
            Re: translating ascii to binary

            On Sep 17, 11:34 pm, Fredrik Lundh <fred...@python ware.comwrote:
            Lie wrote:
            Any advice about this matter would be very appreciated.
            Thanks in advance.
            >
            It'd be easier to make a one-char version of ascii2bin then make the
            string version based on the one-char version.
            >
            And it'd be a lot easier to read your posts if you trimmed away at least
            some of the original message before posting.  If you cannot do that for
            some technical reason, I recommend using top-posting instead.
            >
            </F>

            Ah.. yes, sorry for that, I had never thought about that since I use
            Google Groups, which automatically trim long quotes, to access the
            list.

            Comment

            Working...