[Tutor] working with c_byte?

Dave Angel d at davea.name
Sat Mar 24 06:30:17 CET 2012


On 03/24/2012 01:10 AM, Alex Hall wrote:
> Thanks, the&  (bitwise operator) trick seems to be promising. Should I
> still mod by 256? If so, could you explain why, since the value cannot
> exceed 127? Also, how does that work if a possible vlaue is 255,
> according to the documentation?
>

You top-posted, which loses all earlier context.  Please put your 
response *after* whatever you're quoting.

I gave several possibilities;  you should use whichever seems to make 
the code clearest to you.  I think using a c_ubyte is the most 
straightforward.  That has values from 0 to 255, so it'd match the 
documentation.

But if you're sticking with c_byte, you have a signed value.  So the 
docs lie about the range being 0 to 255.  Or maybe they're written for 
some other language.  If you want to explicitly get the values 0 to 255, 
you can use the expression I provided, using modulo 256.

But the & operator doesn't care a bit.  (no pun intended).  You can use 
it on signed or on unsigned, or on unsigned modulo-ed data.  No change.

This all assumes you're running on a twos-complement processor, like the 
Intel Pentium.  If you're on ones-complement, half this stuff breaks, 
and the other half doesn't work very well.  Bit twiddling is quite 
processor specific.  Fortunately for us, the vast majority of machines 
these days use twos-complement.

One other thing:  these problems are not specific to Python.  I spent 
quite a while 15 years ago teaching a Java developer how to deal with 
similar issues.  At that time at least, Java didn't even have unsigned 
bytes.

-- 

DaveA


More information about the Tutor mailing list