CL 47341 added support for decoding non-padded messages. But DecodedLen
still returned a multiple of 5 for messages without a padding, even
though it is possible to calculate the len exactly when using NoPadding.
This change makes DecodedLen return the exact number of bytes that
will be written. A change to the decoding logic is also made so that it
can handle this case.
DecodedLen now has the same behaviour as DecodedLen in encoding/base64.
Fixes #20854
Change-Id: I729e0b1c0946c866fb675c854f835f366dd4b5a4
Reviewed-on: https://go-review.googlesource.com/47710
Reviewed-by: Brad Fitzpatrick <bradfitz@golang.org>
Run-TryBot: Brad Fitzpatrick <bradfitz@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
case 2:
dst[0] = dbuf[0]<<3 | dbuf[1]>>2
}
- dst = dst[5:]
+
+ if !end {
+ dst = dst[5:]
+ }
+
switch dlen {
case 2:
n += 1
// corresponding to n bytes of base32-encoded data.
func (enc *Encoding) DecodedLen(n int) int {
if enc.padChar == NoPadding {
- // +6 represents the missing padding
- return (n + 6) / 8 * 5
+ return n * 5 / 8
}
return n / 8 * 5
}},
{"NoPadding", StdEncoding.WithPadding(NoPadding), []test{
{0, 0, 0},
- {1, 2, 5},
- {2, 4, 5},
+ {1, 2, 1},
+ {2, 4, 2},
{5, 8, 5},
- {6, 10, 10},
- {7, 12, 10},
+ {6, 10, 6},
+ {7, 12, 7},
{10, 16, 10},
- {11, 18, 15},
+ {11, 18, 11},
}},
} {
t.Run(test.name, func(t *testing.T) {