On 2008-04-18 14:37:21 -0600, Ross Ridge <[EMAIL PROTECTED]> said: > Bob Greschke <[EMAIL PROTECTED]> wrote: >> I'm reading 3-byte numbers from a file and they are signed (+8 to >> -8million). This seems to work, but I'm not sure it's right. >> >> # Convert the 3-characters into a number. >> Value1, Value2, Value3 = unpack(">BBB", Buffer[s:s+3]) >> Value = (Value1*65536)+(Value2*256)+Value3 >> if Value >= 0x800000: >> Value -= 0x1000000 >> print Value >> >> For example: >> 16682720 = -94496 >> >> Should it be Value -= 0x1000001 so that I get -94497, instead? > > Your first case is correct, "Value -= 0x1000000". The value 0xFFFFFFF > should be -1 and 0xFFFFFFF - 0x1000000 == -1. > > An alternative way of doing this: > > Value = unpack(">l", Buffer[s:s+3] + "\0")[0] >> 8 > > Ross Ridge
Good to know (never was good on the math front). However, in playing around with your suggestion and Grant's code I've found that the struct stuff is WAY slower than doing something like this Value = (ord(Buf[s])*65536)+(ord(Buf[s+1])*256)+ord(Buf[s+2]) if Value >= 0x800000: Value -= 0x1000000 This is almost twice as fast just sitting here grinding through a few hundred thousand conversions (like 3sec vs. ~5secs just counting on my fingers - on an old Sun...it's a bit slow). Replacing *65536 with <<16 and *256 with <<8 might even be a little faster, but it's too close to call without really profiling it. I wasn't planning on making this discovery today! :) Bob -- http://mail.python.org/mailman/listinfo/python-list