added ReadNInto
This commit is contained in:
23
bin.go
23
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 {
|
||||
|
||||
Reference in New Issue
Block a user