Skip to content

Commit

Permalink
Added readme, license
Browse files Browse the repository at this point in the history
float convertion fix
  • Loading branch information
2tvenom committed Mar 16, 2014
1 parent c2959e5 commit 91d4344
Show file tree
Hide file tree
Showing 4 changed files with 113 additions and 9 deletions.
13 changes: 13 additions & 0 deletions LICENSE
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
Version 2, December 2004

Copyright (C) 2014 Pavel <Ven> Gulbin <2tvenom@gmail.com>

Everyone is permitted to copy and distribute verbatim or modified
copies of this license document, and changing it is allowed as long
as the name is changed.

DO WHAT THE FUCK YOU WANT TO PUBLIC LICENSE
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION

0. You just DO WHAT THE FUCK YOU WANT TO.
80 changes: 80 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,80 @@
#CBOR encoder for Go
--------
Decoder/encoder from Go data to CBOR binary string. This code has been developed and maintained by Ven at March 2014.

CBOR is an object representation format defined by the [IETF](http://ietf.org).
The [specification](http://tools.ietf.org/html/rfc7049)
has recently been approved as an IETF Standards-Track specification
and has been published as RFC 7049.

## Usage
```go
package main

import (
"fmt"
"cbor"
"bytes"
)
//custom struct
type Vector struct {
X, Y, Z int
Range []Range
Label string
}

type Range struct {
Length int
Align float32
}

func main() {
v := &Vector {
X: 10,
Y: 15,
Z: 100,
Range: []Range{
Range {1,10},
Range {223432423,30},
Range {3,41.5},
Range {174,55555.2},
},
Label: "HoHoHo",
}

//create encoder and marshal
var buffTest bytes.Buffer
encoder := cbor.NewEncoder(&buffTest)
ok, error := encoder.Marshal(v)
//check binary string
if !ok {
fmt.Errorf("Error decoding %s", error)
} else {
fmt.Printf("Variable Hex = % x\n", buffTest.Bytes())
fmt.Printf("Variable = %v\n", buffTest.Bytes())
}
fmt.Printf("-----------------\n")

//unmarshal binary string to new struct
var vd Vector
ok, err := encoder.Unmarshal(buffTest.Bytes(), &vd)

if !ok {
fmt.Printf("Error Unmarshal %s", err)
return
}
//output
fmt.Printf("%v", vd)
}
```

## Compatibility

Checked with [PHP extension](https://github.com/2tvenom/CBOREncode) in encode and decode

## Known issues

- Not support tags. 6 major type *(in future)*
- Not support 16 floats encoding
- Not decode nil (null) vars
- Encode does't support indefinite-length values.
7 changes: 4 additions & 3 deletions src/cbor.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import (
"cbor"
"bytes"
)

//custom struct
type Vector struct {
X, Y, Z int
Range []Range
Expand All @@ -31,10 +31,11 @@ func main() {
Label: "HoHoHo",
}

//create encoder and marshal
var buffTest bytes.Buffer
encoder := cbor.NewEncoder(&buffTest)
ok, error := encoder.Marshal(v)

//check binary string
if !ok {
fmt.Errorf("Error decoding %s", error)
} else {
Expand All @@ -51,6 +52,6 @@ func main() {
fmt.Printf("Error Unmarshal %s", err)
return
}

//output
fmt.Printf("%v", vd)
}
22 changes: 16 additions & 6 deletions src/cbor/cbor.go
Original file line number Diff line number Diff line change
Expand Up @@ -316,22 +316,32 @@ func (encoder *cborEncode) decode(v reflect.Value) (bool, error) {
return false, err
}

v.Set(reflect.ValueOf(&out).Elem())
if v.Kind() == reflect.Float32 {
v.Set(reflect.ValueOf(&out).Elem())
} else if v.Kind() == reflect.Float64 {
out64 := float64(out)
v.Set(reflect.ValueOf(&out64).Elem())
} else {
return false, fmt.Errorf("Can convert %s to float32", v.Type())
}

return true, nil
case additionalTypeFloat64:
if v.Kind() != reflect.Float64 {
return false, fmt.Errorf("Can convert %s to float64", v.Type())
}
var out float64

err := unpack(buff, &out)

if err != nil {
return false, err
}

v.Set(reflect.ValueOf(&out).Elem())
if v.Kind() == reflect.Float64 {
v.Set(reflect.ValueOf(&out).Elem())
} else if v.Kind() == reflect.Float32 {
out32 := float32(out)
v.Set(reflect.ValueOf(&out32).Elem())
} else {
return false, fmt.Errorf("Can convert %s to float64", v.Type())
}

return true, nil
}
Expand Down

0 comments on commit 91d4344

Please sign in to comment.