homepage

This issue tracker has been migrated to GitHub , and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author trevp
Recipients
Date 2004年03月26日.03:17:02
SpamBayes Score
Marked as misclassified
Message-id
In-reply-to
Content
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
History
Date User Action Args
2007年08月23日 15:36:54adminlinkissue923643 messages
2007年08月23日 15:36:54admincreate

AltStyle によって変換されたページ (->オリジナル) /