decode.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685
  1. // Copyright (c) 2012, 2013 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license found in the LICENSE file.
  3. package codec
  4. import (
  5. "io"
  6. "reflect"
  7. //"math"
  8. "fmt"
  9. "time"
  10. )
  11. // Some tagging information for error messages.
  12. var (
  13. msgTagDec = "codec.decoder"
  14. msgBadDesc = "Unrecognized descriptor byte"
  15. digits = [...]byte {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
  16. )
  17. type decodeNakedContext uint8
  18. const (
  19. dncHandled decodeNakedContext = iota
  20. dncNil
  21. dncExt
  22. dncContainer
  23. )
  24. // decReader abstracts the reading source, allowing implementations that can
  25. // read from an io.Reader or directly off a byte slice with zero-copying.
  26. type decReader interface {
  27. readn(n int) []byte
  28. readb([]byte)
  29. readn1() uint8
  30. readUint16() uint16
  31. readUint32() uint32
  32. readUint64() uint64
  33. }
  34. type decoder interface {
  35. initReadNext()
  36. currentIsNil() bool
  37. decodeBuiltinType(rt reflect.Type, rv reflect.Value) bool
  38. //decodeNaked should completely handle extensions, builtins, primitives, etc.
  39. //Numbers are decoded as int64, uint64, float64 only (no smaller sized number types).
  40. decodeNaked(h decodeHandleI) (rv reflect.Value, ctx decodeNakedContext)
  41. decodeInt(bitsize uint8) (i int64)
  42. decodeUint(bitsize uint8) (ui uint64)
  43. decodeFloat(chkOverflow32 bool) (f float64)
  44. decodeBool() (b bool)
  45. // decodeString can also decode symbols
  46. decodeString() (s string)
  47. decodeBytes(bs []byte) (bsOut []byte, changed bool)
  48. decodeExt(tag byte) []byte
  49. readMapLen() int
  50. readArrayLen() int
  51. }
  52. type newDecoderFunc func(r decReader) decoder
  53. // A Decoder reads and decodes an object from an input stream in the codec format.
  54. type Decoder struct {
  55. r decReader
  56. d decoder
  57. h decodeHandleI
  58. }
  59. // ioDecReader is a decReader that reads off an io.Reader
  60. type ioDecReader struct {
  61. r io.Reader
  62. x [8]byte //temp byte array re-used internally for efficiency
  63. }
  64. // bytesDecReader is a decReader that reads off a byte slice with zero copying
  65. type bytesDecReader struct {
  66. b []byte // data
  67. c int // cursor
  68. a int // available
  69. }
  70. type decExtTagFn struct {
  71. fn func(reflect.Value, []byte)(error)
  72. tag byte
  73. }
  74. type decExtTypeTagFn struct {
  75. rt reflect.Type
  76. decExtTagFn
  77. }
  78. type decodeHandleI interface {
  79. getDecodeExt(rt reflect.Type) (tag byte, fn func(reflect.Value, []byte) error)
  80. newDecoder(r decReader) decoder
  81. errorIfNoField() bool
  82. }
  83. type decHandle struct {
  84. // put word-aligned fields first (before bools, etc)
  85. exts []decExtTypeTagFn
  86. extFuncs map[reflect.Type] decExtTagFn
  87. // if an extension for byte slice is defined, then always decode Raw as strings
  88. rawToStringOverride bool
  89. }
  90. type DecodeOptions struct {
  91. // An instance of MapType is used during schema-less decoding of a map in the stream.
  92. // If nil, we use map[interface{}]interface{}
  93. MapType reflect.Type
  94. // An instance of SliceType is used during schema-less decoding of an array in the stream.
  95. // If nil, we use []interface{}
  96. SliceType reflect.Type
  97. // ErrorIfNoField controls whether an error is returned when decoding a map
  98. // from a codec stream into a struct, and no matching struct field is found.
  99. ErrorIfNoField bool
  100. }
  101. func (o *DecodeOptions) errorIfNoField() bool {
  102. return o.ErrorIfNoField
  103. }
  104. // addDecodeExt registers a function to handle decoding into a given type when an
  105. // extension type and specific tag byte is detected in the codec stream.
  106. // To remove an extension, pass fn=nil.
  107. func (o *decHandle) addDecodeExt(rt reflect.Type, tag byte, fn func(reflect.Value, []byte) (error)) {
  108. if o.exts == nil {
  109. o.exts = make([]decExtTypeTagFn, 0, 2)
  110. o.extFuncs = make(map[reflect.Type]decExtTagFn, 2)
  111. }
  112. if _, ok := o.extFuncs[rt]; ok {
  113. delete(o.extFuncs, rt)
  114. if rt == byteSliceTyp {
  115. o.rawToStringOverride = false
  116. }
  117. }
  118. if fn != nil {
  119. o.extFuncs[rt] = decExtTagFn{fn, tag}
  120. if rt == byteSliceTyp {
  121. o.rawToStringOverride = true
  122. }
  123. }
  124. if leno := len(o.extFuncs); leno > cap(o.exts) {
  125. o.exts = make([]decExtTypeTagFn, leno, (leno * 3 / 2))
  126. } else {
  127. o.exts = o.exts[0:leno]
  128. }
  129. var i int
  130. for k, v := range o.extFuncs {
  131. o.exts[i] = decExtTypeTagFn {k, v}
  132. i++
  133. }
  134. }
  135. func (o *decHandle) getDecodeExtForTag(tag byte) (rt reflect.Type, fn func(reflect.Value, []byte) error) {
  136. for i, l := 0, len(o.exts); i < l; i++ {
  137. if o.exts[i].tag == tag {
  138. return o.exts[i].rt, o.exts[i].fn
  139. }
  140. }
  141. return
  142. }
  143. func (o *decHandle) getDecodeExt(rt reflect.Type) (tag byte, fn func(reflect.Value, []byte) error) {
  144. if l := len(o.exts); l == 0 {
  145. return
  146. } else if l < mapAccessThreshold {
  147. for i := 0; i < l; i++ {
  148. if o.exts[i].rt == rt {
  149. x := o.exts[i].decExtTagFn
  150. return x.tag, x.fn
  151. }
  152. }
  153. } else {
  154. x := o.extFuncs[rt]
  155. return x.tag, x.fn
  156. }
  157. return
  158. }
  159. // NewDecoder returns a Decoder for decoding a stream of bytes from an io.Reader.
  160. func NewDecoder(r io.Reader, h Handle) (*Decoder) {
  161. z := ioDecReader {
  162. r: r,
  163. }
  164. return &Decoder{ r: &z, d: h.newDecoder(&z), h: h }
  165. }
  166. // NewDecoderBytes returns a Decoder which efficiently decodes directly
  167. // from a byte slice with zero copying.
  168. func NewDecoderBytes(in []byte, h Handle) (*Decoder) {
  169. z := bytesDecReader {
  170. b: in,
  171. a: len(in),
  172. }
  173. return &Decoder{ r: &z, d: h.newDecoder(&z), h: h }
  174. }
  175. // Decode decodes the stream from reader and stores the result in the
  176. // value pointed to by v. v cannot be a nil pointer. v can also be
  177. // a reflect.Value of a pointer.
  178. //
  179. // Note that a pointer to a nil interface is not a nil pointer.
  180. // If you do not know what type of stream it is, pass in a pointer to a nil interface.
  181. // We will decode and store a value in that nil interface.
  182. //
  183. // Sample usages:
  184. // // Decoding into a non-nil typed value
  185. // var f float32
  186. // err = codec.NewDecoder(r, handle).Decode(&f)
  187. //
  188. // // Decoding into nil interface
  189. // var v interface{}
  190. // dec := codec.NewDecoder(r, handle)
  191. // err = dec.Decode(&v)
  192. //
  193. func (d *Decoder) Decode(v interface{}) (err error) {
  194. defer panicToErr(&err)
  195. d.decode(v)
  196. return
  197. }
  198. func (d *Decoder) decode(iv interface{}) {
  199. d.d.initReadNext()
  200. // Fast path included for various pointer types which cannot be registered as extensions
  201. switch v := iv.(type) {
  202. case nil:
  203. decErr("Cannot decode into nil.")
  204. case reflect.Value:
  205. d.chkPtrValue(v)
  206. d.decodeValue(v)
  207. case *string:
  208. *v = d.d.decodeString()
  209. case *bool:
  210. *v = d.d.decodeBool()
  211. case *int:
  212. *v = int(d.d.decodeInt(intBitsize))
  213. case *int8:
  214. *v = int8(d.d.decodeInt(8))
  215. case *int16:
  216. *v = int16(d.d.decodeInt(16))
  217. case *int32:
  218. *v = int32(d.d.decodeInt(32))
  219. case *int64:
  220. *v = int64(d.d.decodeInt(64))
  221. case *uint:
  222. *v = uint(d.d.decodeUint(uintBitsize))
  223. case *uint8:
  224. *v = uint8(d.d.decodeUint(8))
  225. case *uint16:
  226. *v = uint16(d.d.decodeUint(16))
  227. case *uint32:
  228. *v = uint32(d.d.decodeUint(32))
  229. case *uint64:
  230. *v = uint64(d.d.decodeUint(64))
  231. case *float32:
  232. *v = float32(d.d.decodeFloat(true))
  233. case *float64:
  234. *v = d.d.decodeFloat(false)
  235. case *interface{}:
  236. d.decodeValue(reflect.ValueOf(iv).Elem())
  237. default:
  238. rv := reflect.ValueOf(iv)
  239. d.chkPtrValue(rv)
  240. d.decodeValue(rv)
  241. }
  242. }
  243. func (d *Decoder) decodeValue(rv reflect.Value) {
  244. // Note: if stream is set to nil, we set the corresponding value to its "zero" value
  245. // var ctr int (define this above the function if trying to do this run)
  246. // ctr++
  247. // log(".. [%v] enter decode: rv: %v <==> %T <==> %v", ctr, rv, rv.Interface(), rv.Interface())
  248. // defer func(ctr2 int) {
  249. // log(".... [%v] exit decode: rv: %v <==> %T <==> %v", ctr2, rv, rv.Interface(), rv.Interface())
  250. // }(ctr)
  251. dd := d.d //so we don't dereference constantly
  252. dd.initReadNext()
  253. rvOrig := rv
  254. wasNilIntf := rv.Kind() == reflect.Interface && rv.IsNil()
  255. rt := rv.Type()
  256. var ndesc decodeNakedContext
  257. //if nil interface, use some hieristics to set the nil interface to an
  258. //appropriate value based on the first byte read (byte descriptor bd)
  259. if wasNilIntf {
  260. if dd.currentIsNil() {
  261. return
  262. }
  263. //Prevent from decoding into e.g. error, io.Reader, etc if it's nil and non-nil value in stream.
  264. //We can only decode into interface{} (0 methods). Else reflect.Set fails later.
  265. if num := rt.NumMethod(); num > 0 {
  266. decErr("decodeValue: Cannot decode non-nil codec value into nil %v (%v methods)", rt, num)
  267. } else {
  268. rv, ndesc = dd.decodeNaked(d.h)
  269. if ndesc == dncHandled {
  270. rvOrig.Set(rv)
  271. return
  272. }
  273. rt = rv.Type()
  274. }
  275. } else if dd.currentIsNil() {
  276. // Note: if stream is set to nil, we set the dereferenced value to its "zero" value (if settable).
  277. for rv.Kind() == reflect.Ptr {
  278. rv = rv.Elem()
  279. }
  280. if rv.CanSet() {
  281. rv.Set(reflect.Zero(rv.Type()))
  282. }
  283. return
  284. }
  285. // An extension can be registered for any type, regardless of the Kind
  286. // (e.g. type BitSet int64, type MyStruct { / * unexported fields * / }, type X []int, etc.
  287. //
  288. // We can't check if it's an extension byte here first, because the user may have
  289. // registered a pointer or non-pointer type, meaning we may have to recurse first
  290. // before matching a mapped type, even though the extension byte is already detected.
  291. //
  292. // If we are checking for builtin or ext type here, it means we didn't go through decodeNaked,
  293. // Because decodeNaked would have handled it. It also means wasNilIntf = false.
  294. if dd.decodeBuiltinType(rt, rv) {
  295. return
  296. }
  297. if bfnTag, bfnFn := d.h.getDecodeExt(rt); bfnFn != nil {
  298. xbs := dd.decodeExt(bfnTag)
  299. if fnerr := bfnFn(rv, xbs); fnerr != nil {
  300. panic(fnerr)
  301. }
  302. return
  303. }
  304. // Note: In decoding into containers, we just use the stream to UPDATE the container.
  305. // This means that for a struct or map, we just update matching fields or keys.
  306. // For a slice/array, we just update the first n elements, where n is the length of the
  307. // stream.
  308. // However, if the encoded value is Nil in the stream, then we try to set
  309. // to nil, or a "zero" value.
  310. //
  311. // Also, we must ensure that, if decoding into a nil interface{}, we return a non-nil
  312. // value except even if the container registers a length of 0.
  313. //
  314. // NOTE: Do not make blocks for struct, slice, map, etc individual methods.
  315. // It ends up being more expensive, because they recursively calls decodeValue
  316. //
  317. // (Mar 7, 2013. DON'T REARRANGE ... code clarity)
  318. // tried arranging in sequence of most probable ones.
  319. // string, bool, integer, float, struct, ptr, slice, array, map, interface, uint.
  320. switch rk := rv.Kind(); rk {
  321. case reflect.String:
  322. rv.SetString(dd.decodeString())
  323. case reflect.Bool:
  324. rv.SetBool(dd.decodeBool())
  325. case reflect.Int:
  326. rv.SetInt(dd.decodeInt(intBitsize))
  327. case reflect.Int64:
  328. rv.SetInt(dd.decodeInt(64))
  329. case reflect.Int32:
  330. rv.SetInt(dd.decodeInt(32))
  331. case reflect.Int8:
  332. rv.SetInt(dd.decodeInt(8))
  333. case reflect.Int16:
  334. rv.SetInt(dd.decodeInt(16))
  335. case reflect.Float32:
  336. rv.SetFloat(dd.decodeFloat(true))
  337. case reflect.Float64:
  338. rv.SetFloat(dd.decodeFloat(false))
  339. case reflect.Uint8:
  340. rv.SetUint(dd.decodeUint(8))
  341. case reflect.Uint64:
  342. rv.SetUint(dd.decodeUint(64))
  343. case reflect.Uint:
  344. rv.SetUint(dd.decodeUint(uintBitsize))
  345. case reflect.Uint32:
  346. rv.SetUint(dd.decodeUint(32))
  347. case reflect.Uint16:
  348. rv.SetUint(dd.decodeUint(16))
  349. case reflect.Ptr:
  350. if rv.IsNil() {
  351. if wasNilIntf {
  352. rv = reflect.New(rt.Elem())
  353. } else {
  354. rv.Set(reflect.New(rt.Elem()))
  355. }
  356. }
  357. d.decodeValue(rv.Elem())
  358. case reflect.Interface:
  359. d.decodeValue(rv.Elem())
  360. case reflect.Struct:
  361. containerLen := dd.readMapLen()
  362. if containerLen == 0 {
  363. break
  364. }
  365. sfi := getStructFieldInfos(rt)
  366. for j := 0; j < containerLen; j++ {
  367. // var rvkencname string
  368. // ddecode(&rvkencname)
  369. dd.initReadNext()
  370. rvkencname := dd.decodeString()
  371. // rvksi := sfi.getForEncName(rvkencname)
  372. if k := sfi.indexForEncName(rvkencname); k > -1 {
  373. sfik := sfi[k]
  374. if sfik.i > -1 {
  375. d.decodeValue(rv.Field(int(sfik.i)))
  376. } else {
  377. d.decodeValue(rv.FieldByIndex(sfik.is))
  378. }
  379. // d.decodeValue(sfi.field(k, rv))
  380. } else {
  381. if d.h.errorIfNoField() {
  382. decErr("No matching struct field found when decoding stream map with key: %v", rvkencname)
  383. } else {
  384. var nilintf0 interface{}
  385. d.decodeValue(reflect.ValueOf(&nilintf0).Elem())
  386. }
  387. }
  388. }
  389. case reflect.Slice:
  390. // Be more careful calling Set() here, because a reflect.Value from an array
  391. // may have come in here (which may not be settable).
  392. // In places where the slice got from an array could be, we should guard with CanSet() calls.
  393. if rt == byteSliceTyp { // rawbytes
  394. if bs2, changed2 := dd.decodeBytes(rv.Bytes()); changed2 {
  395. rv.SetBytes(bs2)
  396. }
  397. if wasNilIntf && rv.IsNil() {
  398. rv.SetBytes([]byte{})
  399. }
  400. break
  401. }
  402. containerLen := dd.readArrayLen()
  403. if wasNilIntf {
  404. rv = reflect.MakeSlice(rt, containerLen, containerLen)
  405. }
  406. if containerLen == 0 {
  407. break
  408. }
  409. if rv.IsNil() {
  410. // wasNilIntf only applies if rv is nil (since that's what we did earlier)
  411. if containerLen > 0 {
  412. rv.Set(reflect.MakeSlice(rt, containerLen, containerLen))
  413. }
  414. } else {
  415. // if we need to reset rv but it cannot be set, we should err out.
  416. // for example, if slice is got from unaddressable array, CanSet = false
  417. if rvcap, rvlen := rv.Len(), rv.Cap(); containerLen > rvcap {
  418. if rv.CanSet() {
  419. rvn := reflect.MakeSlice(rt, containerLen, containerLen)
  420. if rvlen > 0 {
  421. reflect.Copy(rvn, rv)
  422. }
  423. rv.Set(rvn)
  424. } else {
  425. decErr("Cannot reset slice with less cap: %v that stream contents: %v", rvcap, containerLen)
  426. }
  427. } else if containerLen > rvlen {
  428. rv.SetLen(containerLen)
  429. }
  430. }
  431. for j := 0; j < containerLen; j++ {
  432. d.decodeValue(rv.Index(j))
  433. }
  434. case reflect.Array:
  435. d.decodeValue(rv.Slice(0, rv.Len()))
  436. case reflect.Map:
  437. containerLen := dd.readMapLen()
  438. if containerLen == 0 {
  439. break
  440. }
  441. if rv.IsNil() {
  442. rv.Set(reflect.MakeMap(rt))
  443. }
  444. ktype, vtype := rt.Key(), rt.Elem()
  445. for j := 0; j < containerLen; j++ {
  446. rvk := reflect.New(ktype).Elem()
  447. d.decodeValue(rvk)
  448. if ktype == intfTyp {
  449. rvk = rvk.Elem()
  450. if rvk.Type() == byteSliceTyp {
  451. rvk = reflect.ValueOf(string(rvk.Bytes()))
  452. }
  453. }
  454. rvv := rv.MapIndex(rvk)
  455. if !rvv.IsValid() {
  456. rvv = reflect.New(vtype).Elem()
  457. }
  458. d.decodeValue(rvv)
  459. rv.SetMapIndex(rvk, rvv)
  460. }
  461. default:
  462. decErr("Unhandled value for kind: %v: %s", rk, msgBadDesc)
  463. }
  464. if wasNilIntf {
  465. rvOrig.Set(rv)
  466. }
  467. return
  468. }
  469. func (d *Decoder) chkPtrValue(rv reflect.Value) {
  470. // We cannot marshal into a non-pointer or a nil pointer
  471. // (at least pass a nil interface so we can marshal into it)
  472. if rv.Kind() != reflect.Ptr || rv.IsNil() {
  473. var rvi interface{} = rv
  474. if rv.IsValid() && rv.CanInterface() {
  475. rvi = rv.Interface()
  476. }
  477. decErr("Decode: Expecting valid pointer to decode into. Got: %v, %T, %v",
  478. rv.Kind(), rvi, rvi)
  479. }
  480. }
  481. // ------------------------------------
  482. func (z *ioDecReader) readn(n int) (bs []byte) {
  483. bs = make([]byte, n)
  484. if _, err := io.ReadFull(z.r, bs); err != nil {
  485. panic(err)
  486. }
  487. return
  488. }
  489. func (z *ioDecReader) readb(bs []byte) {
  490. if _, err := io.ReadFull(z.r, bs); err != nil {
  491. panic(err)
  492. }
  493. }
  494. func (z *ioDecReader) readn1() uint8 {
  495. z.readb(z.x[:1])
  496. return z.x[0]
  497. }
  498. func (z *ioDecReader) readUint16() uint16 {
  499. z.readb(z.x[:2])
  500. return bigen.Uint16(z.x[:2])
  501. }
  502. func (z *ioDecReader) readUint32() uint32 {
  503. z.readb(z.x[:4])
  504. return bigen.Uint32(z.x[:4])
  505. }
  506. func (z *ioDecReader) readUint64() uint64 {
  507. z.readb(z.x[:8])
  508. return bigen.Uint64(z.x[:8])
  509. }
  510. // ------------------------------------
  511. func (z *bytesDecReader) consume(n int) (oldcursor int) {
  512. if z.a == 0 {
  513. panic(io.EOF)
  514. }
  515. if n > z.a {
  516. doPanic(msgTagDec, "Trying to read %v bytes. Only %v available", n, z.a)
  517. }
  518. // z.checkAvailable(n)
  519. oldcursor = z.c
  520. z.c = oldcursor + n
  521. z.a = z.a - n
  522. return
  523. }
  524. func (z *bytesDecReader) readn(n int) (bs []byte) {
  525. c0 := z.consume(n)
  526. bs = z.b[c0 : z.c]
  527. return
  528. }
  529. func (z *bytesDecReader) readb(bs []byte) {
  530. copy(bs, z.readn(len(bs)))
  531. }
  532. func (z *bytesDecReader) readn1() uint8 {
  533. c0 := z.consume(1)
  534. return z.b[c0]
  535. }
  536. // Use binaryEncoding helper for 4 and 8 bits, but inline it for 2 bits
  537. // creating temp slice variable and copying it to helper function is expensive
  538. // for just 2 bits.
  539. func (z *bytesDecReader) readUint16() uint16 {
  540. c0 := z.consume(2)
  541. return uint16(z.b[c0+1]) | uint16(z.b[c0])<<8
  542. }
  543. func (z *bytesDecReader) readUint32() uint32 {
  544. c0 := z.consume(4)
  545. return bigen.Uint32(z.b[c0 : z.c])
  546. }
  547. func (z *bytesDecReader) readUint64() uint64 {
  548. c0 := z.consume(8)
  549. return bigen.Uint64(z.b[c0 : z.c])
  550. }
  551. // ----------------------------------------
  552. func decErr(format string, params ...interface{}) {
  553. doPanic(msgTagDec, format, params...)
  554. }
  555. // DecodeTimeExt decodes a []byte into a time.Time,
  556. // and sets into passed reflectValue.
  557. func decodeTime(bs []byte) (tt time.Time, err error) {
  558. var (
  559. tsec int64
  560. tnsec int32
  561. tz uint16
  562. )
  563. switch len(bs) {
  564. case 4:
  565. tsec = int64(int32(bigen.Uint32(bs)))
  566. case 6:
  567. tsec = int64(int32(bigen.Uint32(bs)))
  568. tz = (bigen.Uint16(bs[4:]))
  569. case 8:
  570. tsec = int64(int32(bigen.Uint32(bs)))
  571. tnsec = int32(bigen.Uint32(bs[4:]))
  572. case 10:
  573. tsec = int64(int32(bigen.Uint32(bs)))
  574. tnsec = int32(bigen.Uint32(bs[4:]))
  575. tz = (bigen.Uint16(bs[8:]))
  576. case 9:
  577. tsec = int64(bigen.Uint64(bs))
  578. case 11:
  579. tsec = int64(bigen.Uint64(bs))
  580. tz = (bigen.Uint16(bs[8:]))
  581. case 12:
  582. tsec = int64(bigen.Uint64(bs))
  583. tnsec = int32(bigen.Uint32(bs[8:]))
  584. case 14:
  585. tsec = int64(bigen.Uint64(bs))
  586. tnsec = int32(bigen.Uint32(bs[8:]))
  587. tz = (bigen.Uint16(bs[12:]))
  588. default:
  589. err = fmt.Errorf("Error decoding bytes: %v as time.Time. Invalid length: %v", bs, len(bs))
  590. return
  591. }
  592. if tz == 0 {
  593. tt = time.Unix(tsec, int64(tnsec)).UTC()
  594. } else {
  595. // In stdlib time.Parse, when a date is parsed without a zone name, it uses "" as zone name.
  596. // However, we need name here, so it can be shown when time is printed.
  597. // Zone name is in form: UTC-08:00.
  598. // Note that Go Libs do not give access to dst flag, so we only check for sign bit
  599. tzneg := tz & (1 << 15) != 0 //check if negative sign
  600. tz = tz & 0x1fff //clear 3 MSBs: sign and dst bits
  601. tzoff := int(tz) * 60
  602. var tzname = []byte("UTC+00:00")
  603. if tzneg {
  604. tzoff = -tzoff
  605. tzname[3] = '-'
  606. }
  607. //tzname := fmt.Sprintf("UTC%s%02d:%02d", tzsign, tz/60, tz%60) //perf issue using Sprintf. inline below.
  608. //tzhr, tzmin := tz/60, tz%60 //faster if u convert to int first
  609. tzhr, tzmin := int(tz/60), int(tz%60)
  610. tzname[4] = digits[tzhr/10]
  611. tzname[5] = digits[tzhr%10]
  612. tzname[7] = digits[tzmin/10]
  613. tzname[8] = digits[tzmin%10]
  614. //fmt.Printf(">>>>> DEC: tzname: %s, tzoff: %v\n", tzname, tzoff)
  615. tt = time.Unix(tsec, int64(tnsec)).In(time.FixedZone(string(tzname), tzoff))
  616. }
  617. return
  618. }