2017-01-24 19 views
0

Я пытаюсь создать макет для 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]?

Благодарен за ответы!

+0

Ломтиков имеют общее базовый массив, вы пробовали запись в BUF ​​[2:], buf [4:] и т. д.? –

+0

@FranckJeannin, я пробовал много всего ... Я попробую это сейчас. –

+0

@FranckJeannin, ну вы правы! Я узнал свою ошибку. Я думал, что мне нужно передавать индексы относительно битов, а не байтов, так что 'buf [32:]' not 'buf [4:]'. Спасибо! Пожалуйста, поместите свой комментарий в качестве ответа, я его приму;) –

ответ

0

Ломтики разделяют основной массив, можно написать (PutUint32) в BUF ​​[4:], ЬиЙ [8:] и т.д.