将一个uint32数组写入一个字节切片并将其取回

时间:2017-01-24 16:09:15

标签: unit-testing go binary byte

我正在尝试为os.File或更具体的io.Reader创建模拟。我想在没有实际读数的情况下模拟128位具体数据的读取。

只有一个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时没有用,因为它从一开始就写入切片(过度使用先前的数据)。我尝试了一堆bytesbinary工具的组合,但每次我都无法从字节中获取数据时没有运气。我的最后一次尝试(它不是唯一的):

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]

感谢答案!

1 个答案:

答案 0 :(得分:0)

切片共享一个底层数组,你可以将(PutUint32)写入buf [4:],buf [8:]等。