translating ascii to binary

C

Canned

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(char):
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(ascii_to_bin(char))

print binary
print " ".join(binary)

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.basename(sys.argv[0]), 'text'
sys.exit()

class Converterab:
'''
Ascii-binary converter.
'''
def __init__(self, string):
self.string = string

def ascii_to_bin(self):
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(pos, bindump.pop())
print final # Debug tool, delete this
'''
for ar in bindump:
count += 1
if (count < 8):
final.insert(pos, bindump.pop())
elif (count >= 8):
pos = count
final.insert(pos, bindump.pop())
else:
final.insert(pos, bindump.pop())
'''
final.insert(0, final.pop())

binary = "".join(final)
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
 
L

Lie

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(char):
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(ascii_to_bin(char))
print binary
print " ".join(binary)

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.basename(sys.argv[0]), 'text'
        sys.exit()
class Converterab:
        '''
        Ascii-binary converter.
        '''
        def __init__(self, string):
                self.string = string
        def ascii_to_bin(self):
                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(pos, bindump.pop())
                        print final     # Debug tool, delete this
                '''
                for ar in bindump:
                        count += 1
                        if (count < 8):
                                final.insert(pos, bindump.pop())
                        elif (count >= 8):
                                pos = count
                                final.insert(pos, bindump.pop())
                        else:
                                final.insert(pos, bindump.pop())
                '''
                final.insert(0, final.pop())
                binary = "".join(final)
                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.
 
F

Fredrik Lundh

Lie said:
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>
 
S

Steven D'Aprano

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_bin" 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(self, 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(self):
results = []
for c in self.string:
results.append(self.char_to_bin(c))
return ''.join(results)
 
C

Canned

Steven D'Aprano schreef:
Your "ascii_to_bin" 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(self, 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(self):
results = []
for c in self.string:
results.append(self.char_to_bin(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.
 
L

Lie

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.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,756
Messages
2,569,535
Members
45,008
Latest member
obedient dusk

Latest Threads

Top