92 lines
2.7 KiB
Go
92 lines
2.7 KiB
Go
|
// Package cbor provides primitives for storing different data
|
||
|
// in the CBOR (binary) format. CBOR is defined in RFC7049.
|
||
|
package cbor
|
||
|
|
||
|
import "time"
|
||
|
|
||
|
const (
|
||
|
majorOffset = 5
|
||
|
additionalMax = 23
|
||
|
//Non Values
|
||
|
additionalTypeBoolFalse byte = 20
|
||
|
additionalTypeBoolTrue byte = 21
|
||
|
additionalTypeNull byte = 22
|
||
|
//Integer (+ve and -ve) Sub-types
|
||
|
additionalTypeIntUint8 byte = 24
|
||
|
additionalTypeIntUint16 byte = 25
|
||
|
additionalTypeIntUint32 byte = 26
|
||
|
additionalTypeIntUint64 byte = 27
|
||
|
//Float Sub-types
|
||
|
additionalTypeFloat16 byte = 25
|
||
|
additionalTypeFloat32 byte = 26
|
||
|
additionalTypeFloat64 byte = 27
|
||
|
additionalTypeBreak byte = 31
|
||
|
//Tag Sub-types
|
||
|
additionalTypeTimestamp byte = 01
|
||
|
additionalTypeEmbeddedJSON byte = 31
|
||
|
additionalTypeTagHexString uint16 = 262
|
||
|
//Unspecified number of elements
|
||
|
additionalTypeInfiniteCount byte = 31
|
||
|
)
|
||
|
const (
|
||
|
majorTypeUnsignedInt byte = iota << majorOffset // Major type 0
|
||
|
majorTypeNegativeInt // Major type 1
|
||
|
majorTypeByteString // Major type 2
|
||
|
majorTypeUtf8String // Major type 3
|
||
|
majorTypeArray // Major type 4
|
||
|
majorTypeMap // Major type 5
|
||
|
majorTypeTags // Major type 6
|
||
|
majorTypeSimpleAndFloat // Major type 7
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
maskOutAdditionalType byte = (7 << majorOffset)
|
||
|
maskOutMajorType byte = 31
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
float32Nan = "\xfa\x7f\xc0\x00\x00"
|
||
|
float32PosInfinity = "\xfa\x7f\x80\x00\x00"
|
||
|
float32NegInfinity = "\xfa\xff\x80\x00\x00"
|
||
|
float64Nan = "\xfb\x7f\xf8\x00\x00\x00\x00\x00\x00"
|
||
|
float64PosInfinity = "\xfb\x7f\xf0\x00\x00\x00\x00\x00\x00"
|
||
|
float64NegInfinity = "\xfb\xff\xf0\x00\x00\x00\x00\x00\x00"
|
||
|
)
|
||
|
|
||
|
// IntegerTimeFieldFormat indicates the format of timestamp decoded
|
||
|
// from an integer (time in seconds).
|
||
|
var IntegerTimeFieldFormat = time.RFC3339
|
||
|
|
||
|
// NanoTimeFieldFormat indicates the format of timestamp decoded
|
||
|
// from a float value (time in seconds and nano seconds).
|
||
|
var NanoTimeFieldFormat = time.RFC3339Nano
|
||
|
|
||
|
func appendCborTypePrefix(dst []byte, major byte, number uint64) []byte {
|
||
|
byteCount := 8
|
||
|
var minor byte
|
||
|
switch {
|
||
|
case number < 256:
|
||
|
byteCount = 1
|
||
|
minor = additionalTypeIntUint8
|
||
|
|
||
|
case number < 65536:
|
||
|
byteCount = 2
|
||
|
minor = additionalTypeIntUint16
|
||
|
|
||
|
case number < 4294967296:
|
||
|
byteCount = 4
|
||
|
minor = additionalTypeIntUint32
|
||
|
|
||
|
default:
|
||
|
byteCount = 8
|
||
|
minor = additionalTypeIntUint64
|
||
|
|
||
|
}
|
||
|
dst = append(dst, byte(major|minor))
|
||
|
byteCount--
|
||
|
for ; byteCount >= 0; byteCount-- {
|
||
|
dst = append(dst, byte(number>>(uint(byteCount)*8)))
|
||
|
}
|
||
|
return dst
|
||
|
}
|