diff --git a/bin.go b/bin.go index b12e418..75bb352 100755 --- a/bin.go +++ b/bin.go @@ -70,23 +70,32 @@ func ReadUint32AsInt64(r io.ByteReader, byteOrder ByteOrder) (_ int64, err error // ReadN - безопасно читаем n байт. Обрабатывает все возможные ситуации, в том числе // баги Reader func ReadN(r io.Reader, n int) (_ []byte, err error) { - if n == 0 { + if n < 0 { + err = fmt.Errorf("wrong n=%d", n) return } - if n < 0 { - err = fmt.Errorf("Wrong n=%d", n) - } buf := make([]byte, n) + err = ReadNInto(r, buf) + if err != nil { + return + } + return buf, nil +} + +func ReadNInto(r io.Reader, buf []byte) (err error) { + if len(buf) == 0 { + return + } var q, total, readAttempts int // Избегаем вечного цикла из-за неправильной реализации ридера for readAttempts < maxReadAttempts { - bufsize := n - total + bufsize := len(buf) - total q, err = r.Read(buf[total:]) - // Если буфер заполнен - успех, возвращаем буфер, err игнорируем + // Если буфер заполнен - успех, err игнорируем if q == bufsize { - return buf, nil + return nil } // Если ошибка - выходим с ошибкой if err != nil { diff --git a/bin_test.go b/bin_test.go index 1435553..61a7ad0 100755 --- a/bin_test.go +++ b/bin_test.go @@ -675,6 +675,8 @@ func TestVarSize(t *testing.T) { buf = bytes.NewBuffer(nil) nums = []int{ + 0, + 1, 127, // 7 16383, // 14 2097151, // 21