// 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 // Extended Tags - from https://www.iana.org/assignments/cbor-tags/cbor-tags.xhtml additionalTypeTagNetworkAddr uint16 = 260 additionalTypeTagNetworkPrefix uint16 = 261 additionalTypeEmbeddedJSON uint16 = 262 additionalTypeTagHexString uint16 = 263 // 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 }