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 байт. Обрабатывает все возможные ситуации, в том числе
|
// ReadN - безопасно читаем n байт. Обрабатывает все возможные ситуации, в том числе
|
||||||
// баги Reader
|
// баги Reader
|
||||||
func ReadN(r io.Reader, n int) (_ []byte, err error) {
|
func ReadN(r io.Reader, n int) (_ []byte, err error) {
|
||||||
if n == 0 {
|
if n < 0 {
|
||||||
|
err = fmt.Errorf("wrong n=%d", n)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if n < 0 {
|
|
||||||
err = fmt.Errorf("Wrong n=%d", n)
|
|
||||||
}
|
|
||||||
buf := make([]byte, 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
|
var q, total, readAttempts int
|
||||||
|
|
||||||
// Избегаем вечного цикла из-за неправильной реализации ридера
|
// Избегаем вечного цикла из-за неправильной реализации ридера
|
||||||
for readAttempts < maxReadAttempts {
|
for readAttempts < maxReadAttempts {
|
||||||
bufsize := n - total
|
bufsize := len(buf) - total
|
||||||
q, err = r.Read(buf[total:])
|
q, err = r.Read(buf[total:])
|
||||||
// Если буфер заполнен - успех, возвращаем буфер, err игнорируем
|
// Если буфер заполнен - успех, err игнорируем
|
||||||
if q == bufsize {
|
if q == bufsize {
|
||||||
return buf, nil
|
return nil
|
||||||
}
|
}
|
||||||
// Если ошибка - выходим с ошибкой
|
// Если ошибка - выходим с ошибкой
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|||||||
@@ -675,6 +675,8 @@ func TestVarSize(t *testing.T) {
|
|||||||
buf = bytes.NewBuffer(nil)
|
buf = bytes.NewBuffer(nil)
|
||||||
|
|
||||||
nums = []int{
|
nums = []int{
|
||||||
|
0,
|
||||||
|
1,
|
||||||
127, // 7
|
127, // 7
|
||||||
16383, // 14
|
16383, // 14
|
||||||
2097151, // 21
|
2097151, // 21
|
||||||
|
|||||||
Reference in New Issue
Block a user