Przeglądaj źródła

codec: msgpack: support option to encode positive numbers as unsigned (compatibility).

Previously (prior to November 2017), positive integers were encoded as unsigned.
This was remedied thereafter. However, for compatibility, we need to ensure that
previously encoded values remain canonical (ie re-encoding should not change the bits).

This option allows folks get the prior behaviour.

Fixes #257
Ugorji Nwoke 7 lat temu
rodzic
commit
00b869d2f4
1 zmienionych plików z 6 dodań i 4 usunięć
  1. 6 4
      codec/msgpack.go

+ 6 - 4
codec/msgpack.go

@@ -210,10 +210,9 @@ func (e *msgpackEncDriver) EncodeNil() {
 }
 
 func (e *msgpackEncDriver) EncodeInt(i int64) {
-	// if i >= 0 {
-	// 	e.EncodeUint(uint64(i))
-	// } else if false &&
-	if i > math.MaxInt8 {
+	if e.h.PositiveIntUnsigned && i >= 0 {
+		e.EncodeUint(uint64(i))
+	} else if i > math.MaxInt8 {
 		if i <= math.MaxInt16 {
 			e.w.writen1(mpInt16)
 			bigenHelper{e.x[:2], e.w}.writeUint16(uint16(i))
@@ -942,6 +941,9 @@ type MsgpackHandle struct {
 	// a []byte or string based on the setting of RawToString.
 	WriteExt bool
 
+	// PositiveIntUnsigned says to encode positive integers as unsigned.
+	PositiveIntUnsigned bool
+
 	binaryEncodingType
 	noElemSeparators