Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Add copy buttons to all
 blocks\n(function() {\n function addCopyButtons() {\n document.querySelectorAll('pre code').forEach(function(codeBlock) {\n if (codeBlock.parentElement.hasAttribute('data-copy-added')) return;\n codeBlock.parentElement.setAttribute('data-copy-added', 'true');\n \n var btn = document.createElement('button');\n btn.textContent = 'Copy';\n btn.style.cssText = 'position:absolute;top:4px;right:4px;padding:2px 8px;font-size:11px;background:#4ecdc4;border:none;border-radius:4px;color:#1a1a2e;cursor:pointer;opacity:0.7;transition:opacity 0.2s;';\n btn.onmouseover = function() { this.style.opacity = '1'; };\n btn.onmouseout = function() { this.style.opacity = '0.7'; };\n btn.onclick = function() {\n navigator.clipboard.writeText(codeBlock.textContent).then(function() {\n btn.textContent = 'Copied!';\n setTimeout(function() { btn.textContent = 'Copy'; }, 1500);\n });\n };\n codeBlock.parentElement.style.position = 'relative';\n codeBlock.parentElement.appendChild(btn);\n });\n }\n \n addCopyButtons();\n \n // Re-run on dynamic content\n var observer = new MutationObserver(addCopyButtons);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Add Copy Buttons to Code Blocks");
}
} catch(__e) { console.warn('[Userscript:Add Copy Buttons to Code Blocks]', __e); }
})();
(function(){
try {
var __m = "github.com";
var __re = new RegExp('^' + "github\\.com" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Force GitHub README to respect dark mode\n(function() {\n var style = document.createElement('style');\n style.textContent = '\n .markdown-body {\n color-scheme: dark light;\n }\n .markdown-body pre { background: #161b22 !important; }\n .markdown-body code { background: rgba(110, 118, 129, 0.4) !important; }\n .markdown-body table th, .markdown-body table td { border-color: #30363d !important; }\n .markdown-body img { background: #0d1117; }\n .markdown-body blockquote { border-left-color: #8b949e; }\n .markdown-body hr { border-color: #30363d; }\n ';\n document.head.appendChild(style);\n})();", "GitHub Dark Mode README Fix"); } } catch(__e) { console.warn('[Userscript:GitHub Dark Mode README Fix]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Highlight search terms from Google/DuckDuckGo/Bing referrer\n(function() {\n var ref = document.referrer;\n var terms = [];\n \n if (ref.includes('google.com') || ref.includes('duckduckgo.com') || ref.includes('bing.com')) {\n var url = new URL(ref);\n var q = url.searchParams.get('q') || url.searchParams.get('p');\n if (q) {\n terms = q.split(/\\s+/).filter(function(t) { return t.length > 2; });\n }\n }\n \n if (terms.length === 0) return;\n \n var style = document.createElement('style');\n style.textContent = '.userscript-highlight { background: #fbbf24; color: #1a1a2e; padding: 1px 3px; border-radius: 2px; }';\n document.head.appendChild(style);\n \n function highlight(node) {\n if (node.nodeType === 3) { // text node\n var text = node.textContent;\n var found = false;\n terms.forEach(function(term) {\n var regex = new RegExp('(' + term.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\') + ')', 'gi');\n if (regex.test(text)) {\n found = true;\n var frag = document.createDocumentFragment();\n var parts = text.split(regex);\n parts.forEach(function(part, i) {\n if (i % 2 === 0) {\n frag.appendChild(document.createTextNode(part));\n } else {\n var span = document.createElement('span');\n span.className = 'userscript-highlight';\n span.textContent = part;\n frag.appendChild(span);\n }\n });\n node.parentNode.replaceChild(frag, node);\n }\n });\n } else if (node.nodeType === 1 && node.childNodes) { // element\n var skipTags = ['SCRIPT', 'STYLE', 'NOSCRIPT', 'TEXTAREA', 'INPUT', 'SELECT'];\n if (!skipTags.includes(node.tagName)) {\n Array.from(node.childNodes).forEach(highlight);\n }\n }\n }\n \n highlight(document.body);\n \n // Re-highlight on dynamic content\n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1 || node.nodeType === 3) highlight(node);\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Highlight Search Terms"); } } catch(__e) { console.warn('[Userscript:Highlight Search Terms]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Strip utm_, fbclid, gclid, etc. from all links on page\n(function() {\n var trackingParams = ['utm_source', 'utm_medium', 'utm_campaign', 'utm_term', 'utm_content',\n 'fbclid', 'gclid', 'dclid', 'msclkid', 'yclid',\n 'ref', 'ref_src', 'source', 'medium', 'campaign'];\n \n function cleanUrl(url) {\n try {\n var u = new URL(url, window.location.origin);\n var changed = false;\n trackingParams.forEach(function(p) {\n if (u.searchParams.has(p)) {\n u.searchParams.delete(p);\n changed = true;\n }\n });\n return changed ? u.toString() : url;\n } catch (e) {\n return url;\n }\n }\n \n function cleanLinks() {\n document.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n \n cleanLinks();\n \n var observer = new MutationObserver(function(mutations) {\n mutations.forEach(function(m) {\n m.addedNodes.forEach(function(node) {\n if (node.nodeType === 1) {\n if (node.tagName === 'A') cleanLinks();\n node.querySelectorAll('a[href]').forEach(function(a) {\n var clean = cleanUrl(a.href);\n if (clean !== a.href) a.href = clean;\n });\n }\n });\n });\n });\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "Remove Tracking Parameters from Links"); } } catch(__e) { console.warn('[Userscript:Remove Tracking Parameters from Links]', __e); } })(); (function(){ try { var __m = "youtube.com"; var __re = new RegExp('^' + "youtube\\.com" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Auto-enable theater mode on YouTube\n(function() {\n function tryTheater() {\n var btn = document.querySelector('button[aria-label=\"Theater mode\"], ytd-player #player button[title=\"Theater mode\"]');\n if (btn && !btn.classList.contains('activated')) {\n btn.click();\n }\n }\n \n // Try immediately\n tryTheater();\n \n // Try after navigation (SPA)\n var lastUrl = location.href;\n setInterval(function() {\n if (location.href !== lastUrl) {\n lastUrl = location.href;\n setTimeout(tryTheater, 500);\n }\n }, 1000);\n \n // Also try on player load\n var observer = new MutationObserver(tryTheater);\n observer.observe(document.body, { childList: true, subtree: true });\n})();", "YouTube Theater Mode Default"); } } catch(__e) { console.warn('[Userscript:YouTube Theater Mode Default]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Remove or un-stick sticky/fixed headers that block content\n(function() {\n function unstick() {\n document.querySelectorAll('header, nav, [role=\"banner\"], .header, .navbar, .sticky, .fixed-top, [style*=\"position: fixed\"], [style*=\"position:sticky\"]').forEach(function(el) {\n if (el.style.position === 'fixed' || el.style.position === 'sticky' || \n getComputedStyle(el).position === 'fixed' || getComputedStyle(el).position === 'sticky') {\n el.style.position = 'static';\n el.style.top = 'auto';\n el.style.zIndex = 'auto';\n }\n });\n }\n \n unstick();\n \n var observer = new MutationObserver(unstick);\n observer.observe(document.body, { childList: true, subtree: true, attributes: true, attributeFilter: ['style', 'class'] });\n})();", "Kill Sticky Headers"); } } catch(__e) { console.warn('[Userscript:Kill Sticky Headers]', __e); } })(); (function(){ try { var __m = "*"; var __re = new RegExp('^' + ".*" + '
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages

, 'i'); if (__m === '*' || __re.test(location.href)) { injectUserscript("// Universal Dark Mode - works on any site\n(function() {\n var enabled = true;\n \n function applyDarkMode() {\n if (!enabled) return;\n \n // Create style element if it doesn't exist\n var style = document.getElementById('universal-dark-mode-style');\n if (!style) {\n style = document.createElement('style');\n style.id = 'universal-dark-mode-style';\n document.head.appendChild(style);\n }\n \n // Dark mode CSS - inverts colors but preserves images/video\n style.textContent = '\n /* Invert everything except media */\n html {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #1a1a2e !important;\n }\n \n /* Restore images, videos, iframes, canvas */\n img, video, iframe, canvas, svg, picture, [style*=\"background-image\"] {\n filter: invert(1) hue-rotate(180deg) !important;\n }\n \n /* Preserve specific elements that should not be inverted */\n .no-dark-mode, .no-dark-mode *,\n [data-theme=\"light\"], [data-theme=\"light\"],\n .ace_editor, .ace_editor *,\n .CodeMirror, .CodeMirror *,\n .monaco-editor, .monaco-editor *,\n .markdown-body pre, .markdown-body pre *,\n .highlight, .highlight *,\n pre code, pre code * {\n filter: none !important;\n }\n \n /* Fix common UI elements */\n .modal, .popup, .dropdown-menu, .tooltip, .popover {\n filter: invert(1) hue-rotate(180deg) !important;\n background: #2d2d44 !important;\n border-color: #444 !important;\n }\n \n /* Scrollbars */\n ::-webkit-scrollbar { background: #1a1a2e !important; }\n ::-webkit-scrollbar-thumb { background: #444 !important; }\n ::-webkit-scrollbar-thumb:hover { background: #555 !important; }\n \n /* Selection */\n ::selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ::-moz-selection { background: #4ecdc4 !important; color: #1a1a2e !important; }\n ';\n }\n \n function removeDarkMode() {\n var style = document.getElementById('universal-dark-mode-style');\n if (style) style.remove();\n }\n \n // Toggle with Alt+Shift+D\n document.addEventListener('keydown', function(e) {\n if (e.altKey && e.shiftKey && e.key === 'D') {\n e.preventDefault();\n enabled = !enabled;\n if (enabled) {\n applyDarkMode();\n console.log('[Universal Dark Mode] Enabled');\n } else {\n removeDarkMode();\n console.log('[Universal Dark Mode] Disabled');\n }\n }\n });\n \n // Apply on load\n applyDarkMode();\n \n // Re-apply on dynamic content\n var observer = new MutationObserver(function(mutations) {\n if (enabled && !document.getElementById('universal-dark-mode-style')) {\n applyDarkMode();\n }\n });\n observer.observe(document.head, { childList: true });\n \n console.log('[Universal Dark Mode] Loaded - Press Alt+Shift+D to toggle');\n})();", "Universal Dark Mode"); } } catch(__e) { console.warn('[Userscript:Universal Dark Mode]', __e); } })(); })();
Skip to content

Repository files navigation

binary

VersionBuild statusCoverage StatusGo Report CardGoDocLicense


Package binary is uesed to Encode/Decode between go data and byte slice.

The main purpose of this package is to replace package "std.binary".

Compare with other serialization package, this package is with full-feature as gob and protocol buffers, and with high-performance and lightweight as std.binary.

It is designed as a common solution to easily encode/decode between go data and byte slice.

It is recommended to use in net protocol serialization and go memory data serialization such as DB.


Install

$ go get -u github.com/vipally/binary
import(
"github.com/vipally/binary"
)

Change log:

v1.2.0

1.use field tag `binary:"packed"` to encode ints value as varint/uvarint for reged structs.
2.add method Encoder.ResizeBuffer.

v1.1.0

1.fix issue#1 nil pointer encode/decode error.
2.pack 8 bool values as bits in one byte.
3.put one bool bit for pointer fields to check if it is a nil pointer.
4.rename Pack/Unpack to Encode/Decode.

v1.0.0

1.full-type support like gob.
2.light-weight as std.binary.
3.high-performance as std.binary and gob.
4.encoding with fower bytes than std.binary and gob.
5.use RegStruct to improve performance of struct encoding/decoding.
6.take both advantages of std.binary and gob.
7.recommended using in net protocol serialization and DB serialization.

Todo:

1.[Encoder/Decoder].RegStruct to speed up local Coder.
2.[Encoder/Decoder].RegSerializer to speed up BinarySerializer search.
3.reg interface to using BinarySerializer interface.

CopyRight

CopyRight 2017 @Ally Dale. All rights reserved.

Author : Ally Dale(vipally@gmail.com)

Blog : http://blog.csdn.net/vipally

Site : https://github.com/vipally


1. Support all serialize-able basic types:

int, int8, int16, int32, int64,
uint, uint8, uint16, uint32, uint64,
float32, float64, complex64, complex128,
bool, string, slice, array, map, struct.
And their direct pointers. eg: *string, *struct, *map, *slice, *int32.

2. [recommended usage] Use Encode/Decode to read/write memory buffer directly.

Use RegStruct to improve struct encoding/decoding efficiency.

type someRegedStruct struct {
A int `binary:"ignore"`
B string
C uint
}
binary.RegStruct((*someRegedStruct)(nil))
If data implements interface BinaryEncoder, it will use data.Encode/data.Decode to encode/decode data.
NOTE that data.Decode must implement on pointer receiever to enable modifying
receiever.Even though Size/Encode of data can implement on non-pointer receiever,
binary.Encode(&data, nil) is required if data has implement interface BinaryEncoder.
binary.Encode(data, nil) will probably NEVER use BinaryEncoder methods to Encode/Decode
data.
eg:
import "github.com/vipally/binary"
//1.Encode with default buffer
if bytes, err := binary.Encode(&data, nil); err==nil{
//...
}
//2.Encode with existing buffer
size := binary.Sizeof(data)
buffer := make([]byte, size)
if bytes, err := binary.Encode(&data, buffer); err==nil{
//...
}
//3.Decode from buffer
if err := binary.Decode(bytes, &data); err==nil{
//...
}

3. [advanced usage] Encoder/Decoder are exported types aviable for encoding/decoding.

eg:
encoder := binary.NewEncoder(bufferSize)
encoder.Uint32(u32)
encoder.String(str)
encodeResult := encoder.Buffer()
decoder := binary.NewDecoder(buffer)
u32 := decoder.Uint32()
str := decoder.String()

4. Put an extra length field(uvarint,1~10 bytes) before string, slice, array, map.

eg: var s string = "hello"
will be encoded as:
[]byte{0x5, 0x68, 0x65, 0x6c, 0x6c, 0x6f}

5. Pack bool array with bits.

eg: []bool{true, true, true, false, true, true, false, false, true}
will be encoded as:
[]byte{0x9, 0x37, 0x1}

6. Hide struct field when encoding/decoding.

Only encode/decode exported fields.
Support using field tag `binary:"ignore"` to disable encode/decode fields.
eg: type S struct{
A uint32
b uint32
_ uint32
C uint32 `binary:"ignore"`
}
Only field "A" will be encode/decode.

7. Auto allocate for slice, map and pointer.

eg: type S struct{
A *uint32
B *string
C *[]uint8
D []uint32
}
It will new pointers for fields "A, B, C",
and make new slice for fields "*C, D" when decode.

8. int/uint values will be encoded as varint/uvarint(1~10 bytes).

eg: uint(1) will be encoded as: []byte{0x1}
uint(128) will be encoded as: []byte{0x80, 0x1}
uint(32765) will be encoded as: []byte{0xfd, 0xff, 0x1}
int(-5) will be encoded as: []byte{0x9}
int(-65) will be encoded as: []byte{0x81, 0x1}

9. Test results.

Enncoding size(see example of Sizeof).

Encoding bytes is much shorter than std.binary and gob.
var s struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [10]uint8
Bool bool
BoolArray [100]bool
Uint32Array [10]uint32
}
Output:
Sizeof(s) = 133
std.Size(s)= 217
gob.Size(s)= 412

Benchmark test result.

Pack/Unpack unregisted struct is a little slower(80%) than std.binary.Read/std.binary.Write
Pack/Unpack registed struct is much faster(200%) than std.binary.Read/std.binary.Write
Pack/Unpack int array is much faster(230%) than std.binary.Read/std.binary.Write
Pack/Unpack string is a little faster(140%) than gob.Encode/gob.Decode
BenchmarkGobEncodeStruct 1000000 1172 ns/op 300.32 MB/s
BenchmarkStdWriteStruct 1000000 3154 ns/op 23.78 MB/s
BenchmarkWriteStruct 500000 3954 ns/op 18.71 MB/s
BenchmarkWriteRegedStruct 1000000 1627 ns/op 45.48 MB/s
BenchmarkPackStruct 500000 3642 ns/op 20.32 MB/s
BenchmarkPackRegedStruct 1000000 1542 ns/op 47.99 MB/s
BenchmarkGobDecodeStruct 3000000 651 ns/op 540.40 MB/s
BenchmarkStdReadStruct 1000000 2008 ns/op 37.35 MB/s
BenchmarkReadStruct 500000 2386 ns/op 31.01 MB/s
BenchmarkReadRegedStruct 1000000 1194 ns/op 61.97 MB/s
BenchmarkUnackStruct 1000000 2293 ns/op 32.27 MB/s
BenchmarkUnpackRegedStruct 2000000 935 ns/op 79.14 MB/s
BenchmarkGobEncodeInt1000 100000 22871 ns/op 219.58 MB/s
BenchmarkStdWriteInt1000 30000 49502 ns/op 80.80 MB/s
BenchmarkWriteInt1000 50000 26001 ns/op 153.91 MB/s
BenchmarkPackInt1000 100000 21601 ns/op 185.27 MB/s
BenchmarkStdReadInt1000 30000 44035 ns/op 90.84 MB/s
BenchmarkReadInt1000 50000 29761 ns/op 134.47 MB/s
BenchmarkUnackInt1000 50000 25001 ns/op 160.07 MB/s
BenchmarkGobEncodeString 3000000 444 ns/op 301.56 MB/s
BenchmarkStdWriteString unsupported BenchmarkWriteString 3000000 455 ns/op 285.49 MB/s
BenchmarkPackString 5000000 337 ns/op 385.05 MB/s
BenchmarkGobDecodeString 1000000 1266 ns/op 105.84 MB/s
BenchmarkStdReadString unsupported BenchmarkReadString 3000000 550 ns/op 236.06 MB/s
BenchmarkUnackString 5000000 298 ns/op 435.92 MB/s

With full-datatype support like gob.

Followed struct fullStruct is an aviable type that contains all supported types.
Which is not valid for std.binary.
type fullStruct struct {
Int8 int8
Int16 int16
Int32 int32
Int64 int64
Uint8 uint8
Uint16 uint16
Uint32 uint32
Uint64 uint64
Float32 float32
Float64 float64
Complex64 complex64
Complex128 complex128
Array [4]uint8
Bool bool
BoolArray [9]bool
LittleStruct littleStruct
PLittleStruct *littleStruct
String string
PString *string
PInt32 *int32
Slice []*littleStruct
PSlice *[]*string
Float64Slice []float64
BoolSlice []bool
Uint32Slice []uint32
Map map[string]*littleStruct
Map2 map[string]uint16
IntSlice []int
UintSlice []uint
}

Do not supported types.

Followed struct TDoNotSupport is an invalid type that every field is invalid.
type TDoNotSupport struct {
DeepPointer **uint32
Uintptr uintptr
UnsafePointer unsafe.Pointer
Ch chan bool
Map map[uintptr]uintptr
Map2 map[int]uintptr
Map3 map[uintptr]int
Slice []uintptr
Array [2]uintptr
Array2 [2][2]uintptr
Array3 [2]struct{ A uintptr }
Func func()
Struct struct {
PStruct *struct {
PPUintptr **uintptr
}
}
}

License.

Under MIT license.
Copyright (c) 2017 Ally Dale<vipally@gmail.com>
Author : Ally Dale<vipally@gmail.com>
Site : https://github.com/vipally
Origin : https://github.com/vipally/binary

About

package binary is a lightweight and high-performance serialization library to encode/decode between go data and []byte.

Topics

Resources

Stars

23 stars

Watchers

1 watching

Forks

Releases

Packages

Used by

Contributors

Languages