github.com/davecgh/go-xdr@v0.0.0-20161123171359-e6a2ba005892/xdr2/example_test.go (about)

     1  /*
     2   * Copyright (c) 2012-2014 Dave Collins <dave@davec.name>
     3   *
     4   * Permission to use, copy, modify, and distribute this software for any
     5   * purpose with or without fee is hereby granted, provided that the above
     6   * copyright notice and this permission notice appear in all copies.
     7   *
     8   * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     9   * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
    10   * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
    11   * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
    12   * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
    13   * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
    14   * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
    15   */
    16  
    17  package xdr_test
    18  
    19  import (
    20  	"bytes"
    21  	"fmt"
    22  
    23  	"github.com/davecgh/go-xdr/xdr2"
    24  )
    25  
    26  // This example demonstrates how to use Marshal to automatically XDR encode
    27  // data using reflection.
    28  func ExampleMarshal() {
    29  	// Hypothetical image header format.
    30  	type ImageHeader struct {
    31  		Signature   [3]byte
    32  		Version     uint32
    33  		IsGrayscale bool
    34  		NumSections uint32
    35  	}
    36  
    37  	// Sample image header data.
    38  	h := ImageHeader{[3]byte{0xAB, 0xCD, 0xEF}, 2, true, 10}
    39  
    40  	// Use marshal to automatically determine the appropriate underlying XDR
    41  	// types and encode.
    42  	var w bytes.Buffer
    43  	bytesWritten, err := xdr.Marshal(&w, &h)
    44  	if err != nil {
    45  		fmt.Println(err)
    46  		return
    47  	}
    48  
    49  	fmt.Println("bytes written:", bytesWritten)
    50  	fmt.Println("encoded data:", w.Bytes())
    51  
    52  	// Output:
    53  	// bytes written: 16
    54  	// encoded data: [171 205 239 0 0 0 0 2 0 0 0 1 0 0 0 10]
    55  }
    56  
    57  // This example demonstrates how to use Unmarshal to decode XDR encoded data
    58  // from a byte slice into a struct.
    59  func ExampleUnmarshal() {
    60  	// Hypothetical image header format.
    61  	type ImageHeader struct {
    62  		Signature   [3]byte
    63  		Version     uint32
    64  		IsGrayscale bool
    65  		NumSections uint32
    66  	}
    67  
    68  	// XDR encoded data described by the above structure.  Typically this
    69  	// would be read from a file or across the network, but use a manual
    70  	// byte array here as an example.
    71  	encodedData := []byte{
    72  		0xAB, 0xCD, 0xEF, 0x00, // Signature
    73  		0x00, 0x00, 0x00, 0x02, // Version
    74  		0x00, 0x00, 0x00, 0x01, // IsGrayscale
    75  		0x00, 0x00, 0x00, 0x0A, // NumSections
    76  	}
    77  
    78  	// Declare a variable to provide Unmarshal with a concrete type and
    79  	// instance to decode into.
    80  	var h ImageHeader
    81  	bytesRead, err := xdr.Unmarshal(bytes.NewReader(encodedData), &h)
    82  	if err != nil {
    83  		fmt.Println(err)
    84  		return
    85  	}
    86  
    87  	fmt.Println("bytes read:", bytesRead)
    88  	fmt.Printf("h: %+v", h)
    89  
    90  	// Output:
    91  	// bytes read: 16
    92  	// h: {Signature:[171 205 239] Version:2 IsGrayscale:true NumSections:10}
    93  }
    94  
    95  // This example demonstrates how to manually decode XDR encoded data from a
    96  // reader. Compare this example with the Unmarshal example which performs the
    97  // same task automatically by utilizing a struct type definition and reflection.
    98  func ExampleNewDecoder() {
    99  	// XDR encoded data for a hypothetical ImageHeader struct as follows:
   100  	// type ImageHeader struct {
   101  	// 		Signature	[3]byte
   102  	// 		Version		uint32
   103  	// 		IsGrayscale	bool
   104  	// 		NumSections	uint32
   105  	// }
   106  	encodedData := []byte{
   107  		0xAB, 0xCD, 0xEF, 0x00, // Signature
   108  		0x00, 0x00, 0x00, 0x02, // Version
   109  		0x00, 0x00, 0x00, 0x01, // IsGrayscale
   110  		0x00, 0x00, 0x00, 0x0A, // NumSections
   111  	}
   112  
   113  	// Get a new decoder for manual decoding.
   114  	dec := xdr.NewDecoder(bytes.NewReader(encodedData))
   115  
   116  	signature, _, err := dec.DecodeFixedOpaque(3)
   117  	if err != nil {
   118  		fmt.Println(err)
   119  		return
   120  	}
   121  
   122  	version, _, err := dec.DecodeUint()
   123  	if err != nil {
   124  		fmt.Println(err)
   125  		return
   126  	}
   127  
   128  	isGrayscale, _, err := dec.DecodeBool()
   129  	if err != nil {
   130  		fmt.Println(err)
   131  		return
   132  	}
   133  
   134  	numSections, _, err := dec.DecodeUint()
   135  	if err != nil {
   136  		fmt.Println(err)
   137  		return
   138  	}
   139  
   140  	fmt.Println("signature:", signature)
   141  	fmt.Println("version:", version)
   142  	fmt.Println("isGrayscale:", isGrayscale)
   143  	fmt.Println("numSections:", numSections)
   144  
   145  	// Output:
   146  	// signature: [171 205 239]
   147  	// version: 2
   148  	// isGrayscale: true
   149  	// numSections: 10
   150  }
   151  
   152  // This example demonstrates how to manually encode XDR data from Go variables.
   153  // Compare this example with the Marshal example which performs the same task
   154  // automatically by utilizing a struct type definition and reflection.
   155  func ExampleNewEncoder() {
   156  	// Data for a hypothetical ImageHeader struct as follows:
   157  	// type ImageHeader struct {
   158  	// 		Signature	[3]byte
   159  	//		Version		uint32
   160  	//		IsGrayscale	bool
   161  	//		NumSections	uint32
   162  	// }
   163  	signature := []byte{0xAB, 0xCD, 0xEF}
   164  	version := uint32(2)
   165  	isGrayscale := true
   166  	numSections := uint32(10)
   167  
   168  	// Get a new encoder for manual encoding.
   169  	var w bytes.Buffer
   170  	enc := xdr.NewEncoder(&w)
   171  
   172  	_, err := enc.EncodeFixedOpaque(signature)
   173  	if err != nil {
   174  		fmt.Println(err)
   175  		return
   176  	}
   177  
   178  	_, err = enc.EncodeUint(version)
   179  	if err != nil {
   180  		fmt.Println(err)
   181  		return
   182  	}
   183  
   184  	_, err = enc.EncodeBool(isGrayscale)
   185  	if err != nil {
   186  		fmt.Println(err)
   187  		return
   188  	}
   189  
   190  	_, err = enc.EncodeUint(numSections)
   191  	if err != nil {
   192  		fmt.Println(err)
   193  		return
   194  	}
   195  
   196  	fmt.Println("encoded data:", w.Bytes())
   197  
   198  	// Output:
   199  	// encoded data: [171 205 239 0 0 0 0 2 0 0 0 1 0 0 0 10]
   200  }