struct.pack bug?
Jansson Christer
christer.xxx.jansson at ericsson.com
Fri Oct 27 07:45:46 EDT 2006
Fredrik Lundh wrote:
> "Jansson Christer" wrote:
>
>
>>I have discovered that in my Python 2.4.1 installation (on Solaris 8),
>>struct.pack handles things in a way that seems inconsistent to me.
>>
>>I haven't found any comprehensible documentation over known issues with
>>Python 2.4.1 so I try this...
>>
>>Here's the thing:
>>
>>
>>>>>from struct import pack
>>>>>pack('B', -1)
>>
>>Traceback (most recent call last):
>> File "<stdin>", line 1, in ?
>>struct.error: ubyte format requires 0<=number<=255
>>
>>>>>pack('H', -1)
>>
>>Traceback (most recent call last):
>> File "<stdin>", line 1, in ?
>>struct.error: short format requires 0<=number<=USHRT_MAX
>>
>>>>>pack('L', -1)
>>
>>'\xff\xff\xff\xff'
>>
>>Shouldn't pack('L', -1) raise an exception like the others, rather than
>>behaving like pack('l', -1)?
>
>
> probably; the reason for the old behaviour is probably to simplify for code that
> uses Python int's to represent 32-bit values. (mixing longs and ints used to be a
> lot more difficult than it is today).
>
>
>>Is this fixed in later versions?
>
>
> the "struct" module was rewritten in Python 2.5; the new module issues a
> warning, and then appears to *clamp* the value to the allowed range, in-
> stead of grabbing the low bits:
>
>
>>>>import struct
>
>
>>>>struct.pack("B", -1)
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "C:\Python25\Lib\struct.py", line 63, in pack
> return o.pack(*args)
> struct.error: ubyte format requires 0 <= number <= 255
>
>
>>>>struct.pack("H", -1)
>
> Traceback (most recent call last):
> File "<stdin>", line 1, in <module>
> File "C:\Python25\Lib\struct.py", line 63, in pack
> return o.pack(*args)
> struct.error: short format requires 0 <= number <= USHRT_MAX
>
>
>>>>struct.pack("I", -1)
>
> __main__:1: DeprecationWarning: 'I' format requires 0 <= number <= 4294967295
> '\x00\x00\x00\x00'
>
>
>>>>struct.pack("L", -1)
>
> __main__:1: DeprecationWarning: 'L' format requires 0 <= number <= 4294967295
> '\x00\x00\x00\x00'
>
> </F>
>
>
>
Ok this implies that somebody is actually thinking about how to handle
this, so I guess I won't file a bug report and simply solve my problems
without relying on those exceptions...
Thank you!
--
--
Christer Jansson
WiseOne AB
+46 708 21 42 84
More information about the Python-list
mailing list