func Encode(out io.Writer, b *Block) error { if _, err := out.Write(pemStart[1:]); err != nil { return err } if _, err := out.Write([]byte(b.Type + "-----\n")); err != nil { return err } if len(b.Headers) > 0 { const procType = "Proc-Type" h := make([]string, 0, len(b.Headers)) hasProcType := false for k := range b.Headers { if k == procType { hasProcType = true continue } h = append(h, k) } // The Proc-Type header must be written first. // See RFC 1421, section 4.6.1.1 if hasProcType { if err := writeHeader(out, procType, b.Headers[procType]); err != nil { return err } } // For consistency of output, write other headers sorted by key. sort.Strings(h) for _, k := range h { if err := writeHeader(out, k, b.Headers[k]); err != nil { return err } } if _, err := out.Write([]byte{'\n'}); err != nil { return err } } var breaker lineBreaker breaker.out = out b64 := base64.NewEncoder(base64.StdEncoding, &breaker) if _, err := b64.Write(b.Bytes); err != nil { return err } b64.Close() breaker.Close() if _, err := out.Write(pemEnd[1:]); err != nil { return err } _, err := out.Write([]byte(b.Type + "-----\n")) return err }
func ExampleNewEncoder() { input := []byte("foo\x00bar") encoder := base64.NewEncoder(base64.StdEncoding, os.Stdout) encoder.Write(input) // Must close the encoder when finished to flush any partial blocks. // If you comment out the following line, the last partial block "r" // won't be encoded. encoder.Close() // Output: // Zm9vAGJhcg== }
func encodeByteSlice(e *encodeState, v reflect.Value, _ bool) { if v.IsNil() { e.WriteString("null") return } s := v.Bytes() e.WriteByte('"') if len(s) < 1024 { // for small buffers, using Encode directly is much faster. dst := make([]byte, base64.StdEncoding.EncodedLen(len(s))) base64.StdEncoding.Encode(dst, s) e.Write(dst) } else { // for large buffers, avoid unnecessary extra temporary // buffer space. enc := base64.NewEncoder(base64.StdEncoding, e) enc.Write(s) enc.Close() } e.WriteByte('"') }