Closed
Description
I started getting some of these errors on decode:
attempted to decode type "uint" with method for "int"
The culprit was another msgpack implementation
func (e *msgpackEncDriver) EncodeInt(i int64) {
if i >= 0 {
e.EncodeUint(uint64(i))
I found a few other libraries doing this trick. Any suggestions here on how i can morph your library to read them?
update:
I'll spare you reading lua code, but
https://github.com/fperrad/lua-MessagePack/
also defaults to unsigned.
set_integer'unsigned'
update, and one version of python, basically the pattern is "if non-negative, write as unsigned, if negative write as signed"
# You may notice struct.pack("B", obj) instead of the simpler chr(obj) in the
# code below. This is to allow for seamless Python 2 and 3 compatibility, as
# chr(obj) has a str return type instead of bytes in Python 3, and
# struct.pack(...) has the right return type in both versions.
def _pack_integer(obj, fp):
if obj < 0:
if obj >= -32:
fp.write(struct.pack("b", obj))
elif obj >= -2**(8-1):
fp.write(b"\xd0" + struct.pack("b", obj))
elif obj >= -2**(16-1):
fp.write(b"\xd1" + struct.pack(">h", obj))
elif obj >= -2**(32-1):
fp.write(b"\xd2" + struct.pack(">i", obj))
elif obj >= -2**(64-1):
fp.write(b"\xd3" + struct.pack(">q", obj))
else:
raise UnsupportedTypeException("huge signed int")
else:
if obj <= 127:
fp.write(struct.pack("B", obj))
elif obj <= 2**8-1:
fp.write(b"\xcc" + struct.pack("B", obj))
elif obj <= 2**16-1:
fp.write(b"\xcd" + struct.pack(">H", obj))
elif obj <= 2**32-1:
fp.write(b"\xce" + struct.pack(">I", obj))
elif obj <= 2**64-1:
fp.write(b"\xcf" + struct.pack(">Q", obj))
else:
raise UnsupportedTypeException("huge unsigned int")
Metadata
Metadata
Assignees
Labels
No labels