python: integer out of range for 'L' format code

jaeyong picture jaeyong · Aug 16, 2012 · Viewed 8.8k times · Source

In python, the code is the following

envimsg = struct.pack("!LHL", 1, 0, int(jsonmsg["flow_id"], 16)) + \
          struct.pack("!HQH", 1, int(flow["src id"],16), 0) + \
          struct.pack("!HQH", 1, int(flow["dst id"],16), int(flow["dst port"],16)) + \
          struct.pack("!H", 0) + \
          struct.pack("!HHHLL", int(jsonmsg["app_src_port"],10), int(jsonmsg["app_dst_port"],10), int(jsonmsg["app_proto"],10), int(jsonmsg["app_src_ip"],10), int(jsonmsg["app_dst_ip"],10))

at the line

struct.pack("!H", 0) + \

I encounter this error:

  File "./Translate_2503.py", line 205, in lavi2envi
    struct.pack("!H", 0) + \
struct.error: integer out of range for 'L' format code

which is strange because I try to pack in H (unsigned short).

Any clues?

My python version 2.7.3. CPU archi is 32bit.

Answer

maki picture maki · Oct 15, 2016

Even in the error line is pointing to this line, the error is not located there. Executing this instruction in the Python interpreter produces no error:

import struct
struct.pack("!H", 0)
>>> '\x00\x00'

This makes sense, as the error is complaining on the 'L' format code, so the error will be located in the ones which use this format.

Given that 'L' is used for unsigned long, and the message complains on being out of range, the error is because one (or more) of the variables used are negative, producing the out of range for unsigned long.

This can be verified in the Python interpreter:

import struct

struct.pack("!HHHLL", 1, 2, 3, 4, 5)
>>> '\x00\x01\x00\x02\x00\x03\x00\x00\x00\x04\x00\x00\x00\x05'

struct.pack("!HHHLL", 1, 2, 3, -4, 5)
>>> Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
struct.error: integer out of range for 'L' format code