code: func (c *Container) readFrom(r io.Reader) error {
  	crc := crc32.NewIEEE()
  	er := errorReader{r: io.TeeReader(r, crc)}
  	var buf [4]byte
  	io.ReadFull(&er, buf[:])
  	c.blockLen = int32(binary.LittleEndian.Uint32(buf[:]))
  	c.refID = er.itf8()
  	c.start = er.itf8()
  	c.span = er.itf8()
  	c.nRec = er.itf8()
  	c.recCount = er.ltf8()
  	c.bases = er.ltf8()
  	c.blocks = er.itf8()
  	c.landmarks = er.itf8slice()
  	sum := crc.Sum32()
  	_, err := io.ReadFull(&er, buf[:])
  	if err != nil {
  		return err
  	}
  	c.crc32 = binary.LittleEndian.Uint32(buf[:])
  	if c.crc32 != sum {
  		return fmt.Errorf("cram: container crc32 mismatch got:0x%08x want:0x%08x", sum, c.crc32)
  	}
  	if er.err != nil {
  		return er.err
  	}
  	// The spec says T[] is {itf8, element...}.
  	// This is not true for byte[] according to
  	// the EOF block.
  	c.blockData = &io.LimitedReader{R: r, N: int64(c.blockLen)}
  	return nil
  }
docs: // readFrom populates a Container from the given io.Reader checking that the
  // CRC32 for the container header is correct.