added ReadNInto

This commit is contained in:
2024-10-31 03:55:08 +02:00
parent d1cbbeac4b
commit 7575d3570a
2 changed files with 18 additions and 7 deletions

23
bin.go
View File

@@ -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 {