package ndr
import (
"bytes"
"encoding/binary"
"math"
)
const (
SizeBool = 1
SizeChar = 1
SizeUint8 = 1
SizeUint16 = 2
SizeUint32 = 4
SizeUint64 = 8
SizeEnum = 2
SizeSingle = 4
SizeDouble = 8
SizePtr = 4
)
func (dec *Decoder ) readBool () (bool , error ) {
i , err := dec .readUint8 ()
if err != nil {
return false , err
}
if i != 0 {
return true , nil
}
return false , nil
}
func (dec *Decoder ) readChar () (rune , error ) {
var r rune
a , err := dec .readUint8 ()
if err != nil {
return r , err
}
return rune (a ), nil
}
func (dec *Decoder ) readUint8 () (uint8 , error ) {
b , err := dec .r .ReadByte ()
if err != nil {
return uint8 (0 ), err
}
return uint8 (b ), nil
}
func (dec *Decoder ) readUint16 () (uint16 , error ) {
dec .ensureAlignment (SizeUint16 )
b , err := dec .readBytes (SizeUint16 )
if err != nil {
return uint16 (0 ), err
}
return dec .ch .Endianness .Uint16 (b ), nil
}
func (dec *Decoder ) readUint32 () (uint32 , error ) {
dec .ensureAlignment (SizeUint32 )
b , err := dec .readBytes (SizeUint32 )
if err != nil {
return uint32 (0 ), err
}
return dec .ch .Endianness .Uint32 (b ), nil
}
func (dec *Decoder ) readUint64 () (uint64 , error ) {
dec .ensureAlignment (SizeUint64 )
b , err := dec .readBytes (SizeUint64 )
if err != nil {
return uint64 (0 ), err
}
return dec .ch .Endianness .Uint64 (b ), nil
}
func (dec *Decoder ) readInt8 () (int8 , error ) {
dec .ensureAlignment (SizeUint8 )
b , err := dec .readBytes (SizeUint8 )
if err != nil {
return 0 , err
}
var i int8
buf := bytes .NewReader (b )
err = binary .Read (buf , dec .ch .Endianness , &i )
if err != nil {
return 0 , err
}
return i , nil
}
func (dec *Decoder ) readInt16 () (int16 , error ) {
dec .ensureAlignment (SizeUint16 )
b , err := dec .readBytes (SizeUint16 )
if err != nil {
return 0 , err
}
var i int16
buf := bytes .NewReader (b )
err = binary .Read (buf , dec .ch .Endianness , &i )
if err != nil {
return 0 , err
}
return i , nil
}
func (dec *Decoder ) readInt32 () (int32 , error ) {
dec .ensureAlignment (SizeUint32 )
b , err := dec .readBytes (SizeUint32 )
if err != nil {
return 0 , err
}
var i int32
buf := bytes .NewReader (b )
err = binary .Read (buf , dec .ch .Endianness , &i )
if err != nil {
return 0 , err
}
return i , nil
}
func (dec *Decoder ) readInt64 () (int64 , error ) {
dec .ensureAlignment (SizeUint64 )
b , err := dec .readBytes (SizeUint64 )
if err != nil {
return 0 , err
}
var i int64
buf := bytes .NewReader (b )
err = binary .Read (buf , dec .ch .Endianness , &i )
if err != nil {
return 0 , err
}
return i , nil
}
func (dec *Decoder ) readFloat32 () (f float32 , err error ) {
dec .ensureAlignment (SizeSingle )
b , err := dec .readBytes (SizeSingle )
if err != nil {
return
}
bits := dec .ch .Endianness .Uint32 (b )
f = math .Float32frombits (bits )
return
}
func (dec *Decoder ) readFloat64 () (f float64 , err error ) {
dec .ensureAlignment (SizeDouble )
b , err := dec .readBytes (SizeDouble )
if err != nil {
return
}
bits := dec .ch .Endianness .Uint64 (b )
f = math .Float64frombits (bits )
return
}
func (dec *Decoder ) ensureAlignment (n int ) {
p := dec .size - dec .r .Buffered ()
if s := p % n ; s != 0 {
dec .r .Discard (n - s )
}
}
The pages are generated with Golds v0.6.7 . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @Go100and1 (reachable from the left QR code) to get the latest news of Golds .