Я пытаюсь создать макет для os.File
или, если быть более точным, io.Reader
. Я хочу эмулировать чтение 128 бит конкретных данных без фактического чтения.Запишите массив uint32 в кусок байта и получите его обратно
С одним uint32
проблем нет.
Мок:
func (f *FileMock) Read(buf []byte) (n int, err error) {
binary.BigEndian.PutUint32(buf, uint32(2052))
return len(buf), nil
}
Испытано метод (упрощенно):
b := make([]byte, 128)
meta_data := make([]uint32, 4)
_, err = s.Read(b)
if err != nil {
// Handle error
}
binary.Read(bytes.NewBuffer(b), binary.BigEndian, &meta_data)
log.Print(meta_data) // Output [2052 0 0 0]
Но когда мне нужно издеваться чтением uint32
среза PutUint32
не полезно, потому что он пишет в срез от начала (перезаписывает ранее данные). Я попробовал кучу комбинаций bytes
и binary
инструментов, но мне не повезло каждый раз, когда я не могу получить данные из байтов. Существует моя последняя попытка (это не только):
func (f *FileMock) Read(b []byte) (n int, err error) {
buf := bytes.NewBuffer(make([]byte, len(b)))
err = binary.Write(buf, binary.BigEndian, [4]uint32{2051, 123, 28, 28})
buf.Read(b)
return len(b), nil
}
С такой же проверенный метод, как описано выше, я получить пустой кусочек [0, 0, 0, 0]
. Обратите внимание, что это макет для метода os.File.Read
, поэтому я не могу создать новый кусок байтов вместо него. Мне нужно записать мои данные в существующий фрагмент.
Сначала мне интересно, как решить проблему. Также я хочу знать, почему существует только [0, 0, 0, 0]
?
Благодарен за ответы!
Ломтиков имеют общее базовый массив, вы пробовали запись в BUF [2:], buf [4:] и т. д.? –
@FranckJeannin, я пробовал много всего ... Я попробую это сейчас. –
@FranckJeannin, ну вы правы! Я узнал свою ошибку. Я думал, что мне нужно передавать индексы относительно битов, а не байтов, так что 'buf [32:]' not 'buf [4:]'. Спасибо! Пожалуйста, поместите свой комментарий в качестве ответа, я его приму;) –