diff --git a/tape/dynamic.go b/tape/dynamic.go index 67d1a88..e2b1b86 100644 --- a/tape/dynamic.go +++ b/tape/dynamic.go @@ -41,6 +41,7 @@ func EncodeAny(encoder *Encoder, value any, tag Tag) (n int, err error) { } nn, err := encoder.Write(value) n += nn; if err != nil { return n, err } + return n, nil } // aggregates @@ -184,7 +185,7 @@ func TagAny(value any) (Tag, error) { // aggregates reflectType := reflect.TypeOf(value) switch reflectType.Kind() { - case reflect.Slice: return OTA.WithCN(reflect.ValueOf(value).Len() - 1), nil + case reflect.Slice: return OTA.WithCN(IntBytes(uint64(reflect.ValueOf(value).Len())) - 1), nil case reflect.Array: return OTA.WithCN(reflectType.Len()), nil case reflect.Map: if reflectType.Key() == reflect.TypeOf(uint16(0)) { @@ -203,7 +204,7 @@ func encodeAnySlice(encoder *Encoder, value any, tag Tag) (n int, err error) { reflectType := reflect.TypeOf(value) oneTag, err := TagAny(reflect.Zero(reflectType.Elem()).Interface()) if err != nil { return n, err } - for index := 0; index <= reflectValue.Len(); index += 1 { + for index := 0; index < reflectValue.Len(); index += 1 { item := reflectValue.Index(index).Interface() itemTag, err := TagAny(item) if err != nil { return n, err } @@ -212,7 +213,7 @@ func encodeAnySlice(encoder *Encoder, value any, tag Tag) (n int, err error) { if oneTag.Is(SBA) { oneTag += 1 << 5 } nn, err = encoder.WriteUint8(uint8(oneTag)) n += nn; if err != nil { return n, err } - for index := 0; index <= reflectValue.Len(); index += 1 { + for index := 0; index < reflectValue.Len(); index += 1 { item := reflectValue.Index(index).Interface() nn, err = EncodeAny(encoder, item, oneTag) n += nn; if err != nil { return n, err } @@ -232,7 +233,7 @@ func encodeAnyMap(encoder *Encoder, value any, tag Tag) (n int, err error) { nn, err = encoder.WriteUint16(key) n += nn; if err != nil { return n, err } itemTag, err := TagAny(value) - n += nn; if err != nil { return n, err } + if err != nil { return n, err } nn, err = encoder.WriteUint8(uint8(itemTag)) n += nn; if err != nil { return n, err } nn, err = EncodeAny(encoder, value, itemTag)