[Tutor] Hex to Str - still an open issue

Johan Geldenhuys johan at accesstel.co.za
Tue Feb 8 11:03:04 CET 2005


Hi everybody,
I used binary.py and is a bit puzzled by the results I get when
comparing the binary of decimal 2 and the value I get when I convert the
binary to an int.

>>> binary(2)
'00000000000000000000000000000010'
>>> int(00000000000000000000000000000010)
8
>>>

Isn't the int value of this binary string supposd to be '2' and not '8'?

Johan  
On Sat, 2005-02-05 at 17:48, Kent Johnson wrote:

> Liam,
> 
> I think you misunderstand what endianness is.
> 
> Big-endian and little-endian refer to the way a number is stored as bytes in the underlying memory 
> of the computer. This is not something you generally need to worry about in a Python program.
> 
> For example, consider the number 0x12345678. On most modern computers this will be stored in four 
> consecutive bytes of computer memory. The individual bytes will contain the values 0x12, 0x34, 0x56, 
> 0x78. The question is, what is the order of those bytes in memory? On a big-endian computer, the 
> most significant byte - 0x12 - is stored at the lowest memory address, so the sequence of bytes will 
> be 0x12, 0x34, 0x56, 0x78. On a little-endian computer, the least-significant byte is stored at the 
> lowest address, and the order will be reversed: 0x78, 0x56, 0x34, 0x12.
> 
> Most programming languages will hide this detail from you most of the time. Even in assembly 
> language, you generally load and store integers without worrying about endianness. Math operations 
> just do the right thing so you don't have to worry about it.
> 
> Endianness becomes an issue when you want to convert between representations, and when binary data 
> is shared between computers which may have different endianness.
> 
> For example in a C program you might want to get the high byte of an integer when you know the 
> address of the integer. The desired byte will be at (address+0) or (address+3) depending on the 
> endianness of the hardware.
> 
> Similarly, if an array of integers is written to a file in a binary representation (not as ASCII 
> strings representing the integers, but as 32-bit values), then to correctly read the file you have 
> to know the endianness of the data in the file.
> 
> 
> OK, so what does this have to do with converting a number to binary in Python? Well, nothing, 
> actually. First, note that 'binary representation' can mean two different things. In the description 
> above, I was talking about the actual bit pattern stored in the computer. Python works with binary 
> numbers all the time, in this sense, but it is under the hood. The other meaning of 'binary 
> representation' is that of a base-2 string representation of a number.
> 
> So if you ask, "How do I convert a number to binary?" you can mean either of these.
> 
> The first one is trivial. If you have a decimal string representation of the number, use int() to 
> convert it to binary. If you have an integer already, it's already *in* binary, so you don't have to 
> do anything!
> 
> So, "How do I convert a number to binary?", to be interesting, must mean "How do I convert an 
> integer to a base-2 string representation?" And how do you do this? Well, you figured out one way 
> using the mathematical properties of integers. These operations are independent of endianness, and 
> so is the desired result.
> 
> The base-2 string representation of  the number (whose base-16 string representation is) 0x1234 is 
> '0001001000110100'. The order of digits here is determined by our convention of writing the most 
> significant digits on the left, not by the endianness of the underlying computer.
> 
> OK, this is long enough, I hope I have shed some light...
> Kent
> 
> 
> 
> Liam Clarke wrote:
> > Jacob - just for you, begin your agitation for the next release please ;)
> > 
> > binstring.py, as attached. 
> > (also pasted up - http://www.rafb.net/paste/results/5feItM57.html)
> > 
> > Creating this, was just a brain teaser, but I was thinking 'what if I
> > wanted to make this for the standard library.'
> > 
> > And so you can see, I had to include a flag for endianess. But that
> > was really a cheap trick. If this was going into a standard library,
> > I'd want to query the OS for endianess. As for the bits, once again,
> > 32 bit is the norm, but 64 bit is here and spreading.
> > 
> > Also, should it display 11111111 as 255 or 256? Both are valid,
> > depending on context.
> > 
> > Thirdly, if I can do it in 2 minutes, (well, the main part), then
> > should they bother putting it in the standard library considering
> > also,
> > 
> > - How often, really, are you going to need to present a decimal or hex
> > as a binary string.
> > 
> > Lastly - this only does base 10 to base 2. Should I include a base 6
> > to base 2, base 8 to base 2, base 10 to 6, 10 to 8, 8 to 6?
> > 
> > I wouldn't like to write for the standard library, because you can
> > never please everyone.
> > 
> > But yeah, feel free to use the above, just keep my doc strings and comments.
> > 
> > Regards,
> > 
> > Liam Clarke
> > 
> > On Fri, 4 Feb 2005 23:30:19 -0500, Jacob S. <keridee at jayco.net> wrote:
> > 
> >>>The binary value is the same as the hex value.
> >>>The binary representation is 000111110100, but
> >>>unfortunately Python doesn't support binary in
> >>>its string formatting(although it does in int()!
> >>
> >>Uh, question. Why not? It seems that all simple types should be included.
> >>Since the computer stores it as binary, why shouldn't python be able to
> >>display a
> >>string of it in binary? That seems to be a short coming that should be added
> >>to the
> >>next release... IMHO of course.
> >>Jacob Schmidt
> >>
> >>_______________________________________________
> >>Tutor maillist  -  Tutor at python.org
> >>http://mail.python.org/mailman/listinfo/tutor
> >>
> > 
> > 
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > ######
> > # binString.py
> > # by Liam Clarke
> > #(Let me know when it's included in the standard library ;-))
> > ######
> > 
> > """Converts a integer base 10 to a string base 2"""
> > 
> > def binary(decimalInt, bigEndian = True, bits = 32, truncExcess = False):
> >     """
> > Integer to be converted is essential, Endianess is an optional flag;
> > me being a Win32 user, Endianess is big by default, defaults to a 32-bit
> > representation, most integers in Python being 32 bit. truncExcess will 
> > strip place-holder zeros for succintness.
> > 
> > Oh, and it will represent 11111111 as 256, as I'm not sure whether you want
> > to start counting for zero with this. It's a simple matter to change."""
> >     tempList = ['0' for x in range(bits)]
> >     
> >     for bitPlace in range(bits, -1, -1):
> >         if decimalInt - 2**bitPlace >= 0:
> >             tempList[bitPlace] = '1'
> >             decimalInt = decimalInt - 2**bitPlace
> >     if bigEndian:
> >         tempList.reverse()
> >     
> >     outPut = ''.join(tempList)
> >     
> >     if truncExcess:
> >         if bigEndian:
> >             outPut=outPut.lstrip('0')
> >         else:
> >             outPut=outPut.rstrip('0')
> >     
> >     return outPut
> > 
> > 
> > ------------------------------------------------------------------------
> > 
> > _______________________________________________
> > Tutor maillist  -  Tutor at python.org
> > http://mail.python.org/mailman/listinfo/tutor
> 
> _______________________________________________
> Tutor maillist  -  Tutor at python.org
> http://mail.python.org/mailman/listinfo/tutor

-- 
This E-Mail has been scanned.
Enjoy Your Day.

-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://mail.python.org/pipermail/tutor/attachments/20050208/ca1ef0df/attachment.htm


More information about the Tutor mailing list