|
@@ -27,6 +27,7 @@ func BytesToInt64(bytes []byte) int64 {
|
|
return num
|
|
return num
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ioError возвращает ошибку ввода выввода
|
|
func ioError(field string, err error) IErrorArgs {
|
|
func ioError(field string, err error) IErrorArgs {
|
|
return NewError(
|
|
return NewError(
|
|
"ErrIO",
|
|
"ErrIO",
|
|
@@ -39,6 +40,7 @@ func ioError(field string, err error) IErrorArgs {
|
|
|
|
|
|
// чтение
|
|
// чтение
|
|
|
|
|
|
|
|
+// ReadBuf считывает срез заданного колличества байт и возвращает его
|
|
func ReadBuf(r io.Reader, size int, field string) ([]byte, IErrorArgs) {
|
|
func ReadBuf(r io.Reader, size int, field string) ([]byte, IErrorArgs) {
|
|
buf := make([]byte, size)
|
|
buf := make([]byte, size)
|
|
if _, err := r.Read(buf); err != nil {
|
|
if _, err := r.Read(buf); err != nil {
|
|
@@ -47,6 +49,8 @@ func ReadBuf(r io.Reader, size int, field string) ([]byte, IErrorArgs) {
|
|
return buf, nil
|
|
return buf, nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ReadBufSize считывает размер байтового среза, затем сам срез и возвращает его.
|
|
|
|
+// lenSize - количество байтов, которыми описывается размер основного среза (см. ReadInt64)
|
|
func ReadBufSize(r io.Reader, lenSize int, field string) ([]byte, IErrorArgs) {
|
|
func ReadBufSize(r io.Reader, lenSize int, field string) ([]byte, IErrorArgs) {
|
|
var size int64
|
|
var size int64
|
|
if err := ReadInt64(r, lenSize, field+"_size", &size); err != nil {
|
|
if err := ReadInt64(r, lenSize, field+"_size", &size); err != nil {
|
|
@@ -56,6 +60,9 @@ func ReadBufSize(r io.Reader, lenSize int, field string) ([]byte, IErrorArgs) {
|
|
return buf, err
|
|
return buf, err
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ReadInt64 Считывает срез заданного размера, который конвертируется в число типа int64.
|
|
|
|
+// size - размер среза (может быть от 1 до 8 байт).
|
|
|
|
+// Результат записывается в значение указателя result
|
|
func ReadInt64(r io.Reader, size int, field string, result *int64) IErrorArgs {
|
|
func ReadInt64(r io.Reader, size int, field string, result *int64) IErrorArgs {
|
|
buf := make([]byte, size)
|
|
buf := make([]byte, size)
|
|
if _, err := r.Read(buf); err != nil {
|
|
if _, err := r.Read(buf); err != nil {
|
|
@@ -65,6 +72,7 @@ func ReadInt64(r io.Reader, size int, field string, result *int64) IErrorArgs {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ReadString считывает строку (длина строки, затем строку), см. ReadBufSize
|
|
func ReadString(r io.Reader, lenSize int, field string, result *string) IErrorArgs {
|
|
func ReadString(r io.Reader, lenSize int, field string, result *string) IErrorArgs {
|
|
strBuf, err := ReadBufSize(r, lenSize, field)
|
|
strBuf, err := ReadBufSize(r, lenSize, field)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -74,6 +82,7 @@ func ReadString(r io.Reader, lenSize int, field string, result *string) IErrorAr
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// ReadByte считывает 1 байт
|
|
func ReadByte(r io.Reader, field string, result *byte) IErrorArgs {
|
|
func ReadByte(r io.Reader, field string, result *byte) IErrorArgs {
|
|
buf, err := ReadBuf(r, 1, field)
|
|
buf, err := ReadBuf(r, 1, field)
|
|
if err != nil {
|
|
if err != nil {
|
|
@@ -85,6 +94,7 @@ func ReadByte(r io.Reader, field string, result *byte) IErrorArgs {
|
|
|
|
|
|
// запись
|
|
// запись
|
|
|
|
|
|
|
|
+// WriteBuf записывает срез байтов
|
|
func WriteBuf(w io.Writer, buf []byte, field string) IErrorArgs {
|
|
func WriteBuf(w io.Writer, buf []byte, field string) IErrorArgs {
|
|
if _, err := w.Write(buf); err != nil {
|
|
if _, err := w.Write(buf); err != nil {
|
|
return ioError(field, err)
|
|
return ioError(field, err)
|
|
@@ -92,11 +102,15 @@ func WriteBuf(w io.Writer, buf []byte, field string) IErrorArgs {
|
|
return nil
|
|
return nil
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// WriteInt64 конвертирует число типа int64 в срез заданного размера и записывает его
|
|
func WriteInt64(w io.Writer, val int64, size int, field string) IErrorArgs {
|
|
func WriteInt64(w io.Writer, val int64, size int, field string) IErrorArgs {
|
|
buf := Int64ToBytes(val, size)
|
|
buf := Int64ToBytes(val, size)
|
|
return WriteBuf(w, buf, field)
|
|
return WriteBuf(w, buf, field)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// WriteString записывает строку в поток.
|
|
|
|
+// Сначала записывается размер строки (lenSize - количество байт в срезе размера).
|
|
|
|
+// Далее строка конвертируется в байтовый срез и записывается в поток
|
|
func WriteString(w io.Writer, val, field string, lenSize int) IErrorArgs {
|
|
func WriteString(w io.Writer, val, field string, lenSize int) IErrorArgs {
|
|
// длина
|
|
// длина
|
|
if err := WriteInt64(w, int64(len(val)), lenSize, field+"_size"); err != nil {
|
|
if err := WriteInt64(w, int64(len(val)), lenSize, field+"_size"); err != nil {
|
|
@@ -109,10 +123,14 @@ func WriteString(w io.Writer, val, field string, lenSize int) IErrorArgs {
|
|
return WriteBuf(w, []byte(val), field)
|
|
return WriteBuf(w, []byte(val), field)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// WriteBuf записывает 1 байт в поток
|
|
func WriteByte(w io.Writer, val byte, field string) IErrorArgs {
|
|
func WriteByte(w io.Writer, val byte, field string) IErrorArgs {
|
|
return WriteBuf(w, []byte{val}, field)
|
|
return WriteBuf(w, []byte{val}, field)
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+// WriteBufSize записывает срез байтов в поток.
|
|
|
|
+// Сначала записывается размер среза (lenSize - количество байт в срезе размера).
|
|
|
|
+// Далее в поток записывается сам срез
|
|
func WriteBufSize(w io.Writer, val []byte, lenSize int, field string) IErrorArgs {
|
|
func WriteBufSize(w io.Writer, val []byte, lenSize int, field string) IErrorArgs {
|
|
// длина
|
|
// длина
|
|
if err := WriteInt64(w, int64(len(val)), lenSize, field+"_size"); err != nil {
|
|
if err := WriteInt64(w, int64(len(val)), lenSize, field+"_size"); err != nil {
|