Need elegant way to cast four bytes into a long

Grant Edwards grante at visi.com
Fri Aug 8 17:53:41 CEST 2003


In article <3f33c209$1 at news.si.com>, William S. Huizinga wrote:
> I've got an array.array of unsigned char and would like to make a slice
> of that array (e.g. a[0:4]) become one long like I would in "C" :
> 
> 	l = ((unsigned long *) (&a[0]))[0];

Bad C programming.  Your program isn't portable.

> I have been getting what I want in this sort of manner :
> 
> 	l  = 0L
> 	l  = a[0]
> 	l += a[1] <<  8
> 	l += a[2] << 16
> 	l += a[3] << 24
>
> but I think that's too wordy.  Is there a more intrinsic and elegant way 
> to do this?

How about this:

  l = a[0] + (a[1]<<8) + (a[2]<<16) + (a[3]<<24)

Or you can use struct:

  l = struct.unpack("<I","".join([chr(b)for b in a]))[0]
  
I think that the former is more obvious.  

-- 
Grant Edwards                   grante             Yow!  I always liked FLAG
                                  at               DAY!!
                               visi.com            




More information about the Python-list mailing list