Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > struct.pack bug?

Reply
Thread Tools

struct.pack bug?

 
 
Jansson Christer
Guest
Posts: n/a
 
      10-27-2006
Hi all,

I have discovered that in my Python 2.4.1 installation (on Solaris ,
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)?
Is this fixed in later versions?

(I don't have access to later versions and have failed to install any.
Python 2.5 compiles nicely but "make install" fails without leaving any
clues about how it failed and no installation troubleshooting guides to
be found at python.org. Python 2.4.4 doesn't even compile since it
apparently requires a newer libstdc++ than the one on our system... see
why I'm asking the newsgroup?)

--
--

Christer Jansson
WiseOne AB
+46 708 21 42 84
 
Reply With Quote
 
 
 
 
Fredrik Lundh
Guest
Posts: n/a
 
      10-27-2006
"Jansson Christer" wrote:

> I have discovered that in my Python 2.4.1 installation (on Solaris ,
> 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>



 
Reply With Quote
 
 
 
 
Jansson Christer
Guest
Posts: n/a
 
      10-27-2006
Fredrik Lundh wrote:
> "Jansson Christer" wrote:
>
>
>>I have discovered that in my Python 2.4.1 installation (on Solaris ,
>>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
 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off




Advertisments