Message45671
Sometimes you want to turn a long into a byte-string,
or vice-versa. This is useful in cryptographic protocols,
and probably other network protocols where you need
to exchange large integers.
In 2.4, you can handle unsigned longs with this:
def stringToLong(s):
return long(binascii.hexlify(s), 16)
def longToString(n):
return binascii.unhexlify("%x" % n)
However, these functions are slower than they need to
be, they're kinda kludgey, and they don't handle
negative values.
So here's a proposal:
def stringToLong(s):
return long(s, 256)
def longToString(n):
return n.tostring()
These functions operate on big-endian, 2's-complement
byte-strings. If the value is positive but has its most-
significant-bit set, an extra zero-byte will be
prepended. This is the same way OpenSSL and (I think)
GMP handle signed numbers.
These functions are ~5x faster than the earlier ones,
they're cleaner, and they work with negative numbers.
If you only want to deal with unsigned positive numbers,
you'll have to do some adjustments:
def stringToLong(s):
return long('\0'+s, 256)
def longToString(n):
s = n.tostring()
if s[0] == '\0' and s != '\0':
s = s[1:]
return s
That's not ideal, but it seems better than any interface
change I could think of.
Anyways, the patch adds this to longs. It should be
added to ints too, and I guess it needs tests etc.. I
can help with that, if the basic idea is acceptable.
Trevor |
|
Date |
User |
Action |
Args |
2007-08-23 15:36:54 | admin | link | issue923643 messages |
2007-08-23 15:36:54 | admin | create | |
|