func (x *XdrStream) ReadOne(in interface{}) error { var nbytes uint32 err := binary.Read(x.rdr, binary.BigEndian, &nbytes) if err != nil { x.rdr.Close() if err == io.ErrUnexpectedEOF { return io.EOF } else { return err } } nbytes &= 0x7fffffff x.buf.Reset() if nbytes == 0 { x.rdr.Close() return io.EOF } x.buf.Grow(int(nbytes)) read, err := x.buf.ReadFrom(io.LimitReader(x.rdr, int64(nbytes))) if read != int64(nbytes) { x.rdr.Close() return errors.New("Read wrong number of bytes from XDR") } if err != nil { x.rdr.Close() return err } readi, err := xdr.Unmarshal(&x.buf, in) if int64(readi) != int64(nbytes) { return fmt.Errorf("Unmarshalled %d bytes from XDR, expected %d)", readi, nbytes) } return err }
// ExampleDecodeTransaction shows the lowest-level process to decode a base64 // envelope encoded in base64. func ExampleDecodeTransaction() { data := "AAAAAGL8HQvQkbK2HA3WVjRrKmjX00fG8sLI7m0ERwJW/AX3AAAACgAAAAAAAAABAAAAAAAAAAAAAAABAAAAAAAAAAAAAAAArqN6LeOagjxMaUP96Bzfs9e0corNZXzBWJkFoK7kvkwAAAAAO5rKAAAAAAAAAAABVvwF9wAAAEAKZ7IPj/46PuWU6ZOtyMosctNAkXRNX9WCAI5RnfRk+AyxDLoDZP/9l3NvsxQtWj9juQOuoBlFLnWu8intgxQA" rawr := strings.NewReader(data) b64r := base64.NewDecoder(base64.StdEncoding, rawr) var tx xdr.TransactionEnvelope bytesRead, err := xdr.Unmarshal(b64r, &tx) fmt.Printf("read %d bytes\n", bytesRead) if err != nil { log.Fatal(err) } fmt.Printf("This tx has %d operations\n", len(tx.Tx.Operations)) // Output: read 192 bytes // This tx has 1 operations }
func TestXdrDecode(t *testing.T) { xdrbytes := []byte{ 0, 0, 0, 0, // entry type 0, liveentry 0, 32, 223, 100, // lastmodified 2154340 0, 0, 0, 0, // entry type 0, account 0, 0, 0, 0, // key type 0 23, 140, 68, 253, // ed25519 key (32 bytes) 184, 162, 186, 195, 118, 239, 158, 210, 100, 241, 174, 254, 108, 110, 165, 140, 75, 76, 83, 141, 104, 212, 227, 80, 1, 214, 157, 7, 0, 0, 0, 29, // 64bit balance: 125339976000 46, 216, 65, 64, 0, 0, 129, 170, // 64bit seqnum: 142567144423475 0, 0, 0, 51, 0, 0, 0, 1, // numsubentries: 1 0, 0, 0, 1, // inflationdest type, populated 0, 0, 0, 0, // key type 0 87, 240, 19, 71, // ed25519 key (32 bytes) 52, 91, 9, 62, 213, 239, 178, 85, 161, 119, 108, 251, 168, 90, 76, 116, 12, 48, 134, 248, 115, 255, 117, 50, 19, 18, 170, 203, 0, 0, 0, 0, // flags 0, 0, 0, 19, // homedomain: 19 bytes + 1 null padding 99, 101, 110, 116, // "centaurus.xcoins.de" 97, 117, 114, 117, 115, 46, 120, 99, 111, 105, 110, 115, 46, 100, 101, 0, 1, 0, 0, 0, // thresholds 0, 0, 0, 0, // signers (null) 0, 0, 0, 0, // entry.account.ext.v: 0 0, 0, 0, 0, // entry.ext.v: 0 } assert.Equal(t, len(xdrbytes), 152) var tmp xdr.BucketEntry n, err := xdr.Unmarshal(bytes.NewReader(xdrbytes[:]), &tmp) fmt.Printf("Decoded %d bytes\n", n) if err != nil { panic(err) } assert.Equal(t, len(xdrbytes), n) var out bytes.Buffer n, err = xdr.Marshal(&out, &tmp) fmt.Printf("Encoded %d bytes\n", n) if err != nil { panic(err) } assert.Equal(t, out.Len(), n) assert.Equal(t, out.Bytes(), xdrbytes) }