binc.go 31 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308130913101311
  1. // Copyright (c) 2012-2020 Ugorji Nwoke. All rights reserved.
  2. // Use of this source code is governed by a MIT license found in the LICENSE file.
  3. package codec
  4. import (
  5. "math"
  6. "reflect"
  7. "time"
  8. )
  9. // Symbol management:
  10. // - symbols are stored in a symbol map during encoding and decoding.
  11. // - the symbols persist until the (En|De)coder ResetXXX method is called.
  12. const bincDoPrune = true
  13. // vd as low 4 bits (there are 16 slots)
  14. const (
  15. bincVdSpecial byte = iota
  16. bincVdPosInt
  17. bincVdNegInt
  18. bincVdFloat
  19. bincVdString
  20. bincVdByteArray
  21. bincVdArray
  22. bincVdMap
  23. bincVdTimestamp
  24. bincVdSmallInt
  25. _ // bincVdUnicodeOther
  26. bincVdSymbol
  27. _ // bincVdDecimal
  28. _ // open slot
  29. _ // open slot
  30. bincVdCustomExt = 0x0f
  31. )
  32. const (
  33. bincSpNil byte = iota
  34. bincSpFalse
  35. bincSpTrue
  36. bincSpNan
  37. bincSpPosInf
  38. bincSpNegInf
  39. bincSpZeroFloat
  40. bincSpZero
  41. bincSpNegOne
  42. )
  43. const (
  44. _ byte = iota // bincFlBin16
  45. bincFlBin32
  46. _ // bincFlBin32e
  47. bincFlBin64
  48. _ // bincFlBin64e
  49. // others not currently supported
  50. )
  51. const bincBdNil = 0 // bincVdSpecial<<4 | bincSpNil // staticcheck barfs on this (SA4016)
  52. var (
  53. bincdescSpecialVsNames = map[byte]string{
  54. bincSpNil: "nil",
  55. bincSpFalse: "false",
  56. bincSpTrue: "true",
  57. bincSpNan: "float",
  58. bincSpPosInf: "float",
  59. bincSpNegInf: "float",
  60. bincSpZeroFloat: "float",
  61. bincSpZero: "uint",
  62. bincSpNegOne: "int",
  63. }
  64. bincdescVdNames = map[byte]string{
  65. bincVdSpecial: "special",
  66. bincVdSmallInt: "uint",
  67. bincVdPosInt: "uint",
  68. bincVdFloat: "float",
  69. bincVdSymbol: "string",
  70. bincVdString: "string",
  71. bincVdByteArray: "bytes",
  72. bincVdTimestamp: "time",
  73. bincVdCustomExt: "ext",
  74. bincVdArray: "array",
  75. bincVdMap: "map",
  76. }
  77. )
  78. func bincdescbd(bd byte) (s string) {
  79. return bincdesc(bd>>4, bd&0x0f)
  80. }
  81. func bincdesc(vd, vs byte) (s string) {
  82. if vd == bincVdSpecial {
  83. s = bincdescSpecialVsNames[vs]
  84. } else {
  85. s = bincdescVdNames[vd]
  86. }
  87. if s == "" {
  88. s = "unknown"
  89. }
  90. return
  91. }
  92. type bincEncState struct {
  93. m map[string]uint16 // symbols
  94. }
  95. func (e bincEncState) captureState() interface{} { return e.m }
  96. func (e *bincEncState) resetState() { e.m = nil }
  97. func (e *bincEncState) reset() { e.resetState() }
  98. func (e *bincEncState) restoreState(v interface{}) { e.m = v.(map[string]uint16) }
  99. type bincEncDriver struct {
  100. noBuiltInTypes
  101. encDriverNoopContainerWriter
  102. h *BincHandle
  103. bincEncState
  104. e Encoder
  105. }
  106. func (e *bincEncDriver) encoder() *Encoder {
  107. return &e.e
  108. }
  109. func (e *bincEncDriver) EncodeNil() {
  110. e.e.encWr.writen1(bincBdNil)
  111. }
  112. func (e *bincEncDriver) EncodeTime(t time.Time) {
  113. if t.IsZero() {
  114. e.EncodeNil()
  115. } else {
  116. bs := bincEncodeTime(t)
  117. e.e.encWr.writen1(bincVdTimestamp<<4 | uint8(len(bs)))
  118. e.e.encWr.writeb(bs)
  119. }
  120. }
  121. func (e *bincEncDriver) EncodeBool(b bool) {
  122. if b {
  123. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpTrue)
  124. } else {
  125. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpFalse)
  126. }
  127. }
  128. func (e *bincEncDriver) encSpFloat(f float64) (done bool) {
  129. if f == 0 {
  130. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpZeroFloat)
  131. } else if math.IsNaN(float64(f)) {
  132. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpNan)
  133. } else if math.IsInf(float64(f), +1) {
  134. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpPosInf)
  135. } else if math.IsInf(float64(f), -1) {
  136. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpNegInf)
  137. } else {
  138. return
  139. }
  140. return true
  141. }
  142. func (e *bincEncDriver) EncodeFloat32(f float32) {
  143. if !e.encSpFloat(float64(f)) {
  144. e.e.encWr.writen1(bincVdFloat<<4 | bincFlBin32)
  145. bigen.writeUint32(e.e.w(), math.Float32bits(f))
  146. }
  147. }
  148. func (e *bincEncDriver) EncodeFloat64(f float64) {
  149. if e.encSpFloat(f) {
  150. return
  151. }
  152. b := bigen.PutUint64(math.Float64bits(f))
  153. if bincDoPrune {
  154. i := 7
  155. for ; i >= 0 && (b[i] == 0); i-- {
  156. }
  157. i++
  158. if i <= 6 {
  159. e.e.encWr.writen1(bincVdFloat<<4 | 0x8 | bincFlBin64)
  160. e.e.encWr.writen1(byte(i))
  161. e.e.encWr.writeb(b[:i])
  162. return
  163. }
  164. }
  165. e.e.encWr.writen1(bincVdFloat<<4 | bincFlBin64)
  166. e.e.encWr.writen8(b)
  167. }
  168. func (e *bincEncDriver) encIntegerPrune32(bd byte, pos bool, v uint64) {
  169. b := bigen.PutUint32(uint32(v))
  170. if bincDoPrune {
  171. i := byte(pruneSignExt(b[:], pos))
  172. e.e.encWr.writen1(bd | 3 - i)
  173. e.e.encWr.writeb(b[i:])
  174. } else {
  175. e.e.encWr.writen1(bd | 3)
  176. e.e.encWr.writen4(b)
  177. }
  178. }
  179. func (e *bincEncDriver) encIntegerPrune64(bd byte, pos bool, v uint64) {
  180. b := bigen.PutUint64(v)
  181. if bincDoPrune {
  182. i := byte(pruneSignExt(b[:], pos))
  183. e.e.encWr.writen1(bd | 7 - i)
  184. e.e.encWr.writeb(b[i:])
  185. } else {
  186. e.e.encWr.writen1(bd | 7)
  187. e.e.encWr.writen8(b)
  188. }
  189. }
  190. func (e *bincEncDriver) EncodeInt(v int64) {
  191. if v >= 0 {
  192. e.encUint(bincVdPosInt<<4, true, uint64(v))
  193. } else if v == -1 {
  194. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpNegOne)
  195. } else {
  196. e.encUint(bincVdNegInt<<4, false, uint64(-v))
  197. }
  198. }
  199. func (e *bincEncDriver) EncodeUint(v uint64) {
  200. e.encUint(bincVdPosInt<<4, true, v)
  201. }
  202. func (e *bincEncDriver) encUint(bd byte, pos bool, v uint64) {
  203. if v == 0 {
  204. e.e.encWr.writen1(bincVdSpecial<<4 | bincSpZero)
  205. } else if pos && v >= 1 && v <= 16 {
  206. e.e.encWr.writen1(bincVdSmallInt<<4 | byte(v-1))
  207. } else if v <= math.MaxUint8 {
  208. e.e.encWr.writen2(bd|0x0, byte(v))
  209. } else if v <= math.MaxUint16 {
  210. e.e.encWr.writen1(bd | 0x01)
  211. bigen.writeUint16(e.e.w(), uint16(v))
  212. } else if v <= math.MaxUint32 {
  213. e.encIntegerPrune32(bd, pos, v)
  214. } else {
  215. e.encIntegerPrune64(bd, pos, v)
  216. }
  217. }
  218. func (e *bincEncDriver) EncodeExt(v interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
  219. var bs0, bs []byte
  220. if ext == SelfExt {
  221. bs0 = e.e.blist.get(1024)
  222. bs = bs0
  223. e.e.sideEncode(v, basetype, &bs)
  224. } else {
  225. bs = ext.WriteExt(v)
  226. }
  227. if bs == nil {
  228. e.EncodeNil()
  229. goto END
  230. }
  231. e.encodeExtPreamble(uint8(xtag), len(bs))
  232. e.e.encWr.writeb(bs)
  233. END:
  234. if ext == SelfExt {
  235. e.e.blist.put(bs)
  236. if !byteSliceSameData(bs0, bs) {
  237. e.e.blist.put(bs0)
  238. }
  239. }
  240. }
  241. func (e *bincEncDriver) EncodeRawExt(re *RawExt) {
  242. e.encodeExtPreamble(uint8(re.Tag), len(re.Data))
  243. e.e.encWr.writeb(re.Data)
  244. }
  245. func (e *bincEncDriver) encodeExtPreamble(xtag byte, length int) {
  246. e.encLen(bincVdCustomExt<<4, uint64(length))
  247. e.e.encWr.writen1(xtag)
  248. }
  249. func (e *bincEncDriver) WriteArrayStart(length int) {
  250. e.encLen(bincVdArray<<4, uint64(length))
  251. }
  252. func (e *bincEncDriver) WriteMapStart(length int) {
  253. e.encLen(bincVdMap<<4, uint64(length))
  254. }
  255. func (e *bincEncDriver) EncodeSymbol(v string) {
  256. //symbols only offer benefit when string length > 1.
  257. //This is because strings with length 1 take only 2 bytes to store
  258. //(bd with embedded length, and single byte for string val).
  259. l := len(v)
  260. if l == 0 {
  261. e.encBytesLen(cUTF8, 0)
  262. return
  263. } else if l == 1 {
  264. e.encBytesLen(cUTF8, 1)
  265. e.e.encWr.writen1(v[0])
  266. return
  267. }
  268. if e.m == nil {
  269. e.m = make(map[string]uint16, 16)
  270. }
  271. ui, ok := e.m[v]
  272. if ok {
  273. if ui <= math.MaxUint8 {
  274. e.e.encWr.writen2(bincVdSymbol<<4, byte(ui))
  275. } else {
  276. e.e.encWr.writen1(bincVdSymbol<<4 | 0x8)
  277. bigen.writeUint16(e.e.w(), ui)
  278. }
  279. } else {
  280. e.e.seq++
  281. ui = e.e.seq
  282. e.m[v] = ui
  283. var lenprec uint8
  284. if l <= math.MaxUint8 {
  285. // lenprec = 0
  286. } else if l <= math.MaxUint16 {
  287. lenprec = 1
  288. } else if int64(l) <= math.MaxUint32 {
  289. lenprec = 2
  290. } else {
  291. lenprec = 3
  292. }
  293. if ui <= math.MaxUint8 {
  294. e.e.encWr.writen2(bincVdSymbol<<4|0x0|0x4|lenprec, byte(ui))
  295. } else {
  296. e.e.encWr.writen1(bincVdSymbol<<4 | 0x8 | 0x4 | lenprec)
  297. bigen.writeUint16(e.e.w(), ui)
  298. }
  299. if lenprec == 0 {
  300. e.e.encWr.writen1(byte(l))
  301. } else if lenprec == 1 {
  302. bigen.writeUint16(e.e.w(), uint16(l))
  303. } else if lenprec == 2 {
  304. bigen.writeUint32(e.e.w(), uint32(l))
  305. } else {
  306. bigen.writeUint64(e.e.w(), uint64(l))
  307. }
  308. e.e.encWr.writestr(v)
  309. }
  310. }
  311. func (e *bincEncDriver) EncodeString(v string) {
  312. if e.h.StringToRaw {
  313. e.encLen(bincVdByteArray<<4, uint64(len(v)))
  314. if len(v) > 0 {
  315. e.e.encWr.writestr(v)
  316. }
  317. return
  318. }
  319. e.EncodeStringEnc(cUTF8, v)
  320. }
  321. func (e *bincEncDriver) EncodeStringEnc(c charEncoding, v string) {
  322. if e.e.c == containerMapKey && c == cUTF8 && (e.h.AsSymbols == 1) {
  323. e.EncodeSymbol(v)
  324. return
  325. }
  326. e.encLen(bincVdString<<4, uint64(len(v)))
  327. if len(v) > 0 {
  328. e.e.encWr.writestr(v)
  329. }
  330. }
  331. func (e *bincEncDriver) EncodeStringBytesRaw(v []byte) {
  332. if v == nil {
  333. e.EncodeNil()
  334. return
  335. }
  336. e.encLen(bincVdByteArray<<4, uint64(len(v)))
  337. if len(v) > 0 {
  338. e.e.encWr.writeb(v)
  339. }
  340. }
  341. func (e *bincEncDriver) encBytesLen(c charEncoding, length uint64) {
  342. // MARKER: we currently only support UTF-8 (string) and RAW (bytearray).
  343. // We should consider supporting bincUnicodeOther.
  344. if c == cRAW {
  345. e.encLen(bincVdByteArray<<4, length)
  346. } else {
  347. e.encLen(bincVdString<<4, length)
  348. }
  349. }
  350. func (e *bincEncDriver) encLen(bd byte, l uint64) {
  351. if l < 12 {
  352. e.e.encWr.writen1(bd | uint8(l+4))
  353. } else {
  354. e.encLenNumber(bd, l)
  355. }
  356. }
  357. func (e *bincEncDriver) encLenNumber(bd byte, v uint64) {
  358. if v <= math.MaxUint8 {
  359. e.e.encWr.writen2(bd, byte(v))
  360. } else if v <= math.MaxUint16 {
  361. e.e.encWr.writen1(bd | 0x01)
  362. bigen.writeUint16(e.e.w(), uint16(v))
  363. } else if v <= math.MaxUint32 {
  364. e.e.encWr.writen1(bd | 0x02)
  365. bigen.writeUint32(e.e.w(), uint32(v))
  366. } else {
  367. e.e.encWr.writen1(bd | 0x03)
  368. bigen.writeUint64(e.e.w(), uint64(v))
  369. }
  370. }
  371. //------------------------------------
  372. type bincDecState struct {
  373. bdRead bool
  374. bd byte
  375. vd byte
  376. vs byte
  377. _ bool
  378. // MARKER: consider using binary search here instead of a map (ie bincDecSymbol)
  379. s map[uint16][]byte
  380. }
  381. func (x bincDecState) captureState() interface{} { return x }
  382. func (x *bincDecState) resetState() { *x = bincDecState{} }
  383. func (x *bincDecState) reset() { x.resetState() }
  384. func (x *bincDecState) restoreState(v interface{}) { *x = v.(bincDecState) }
  385. type bincDecDriver struct {
  386. decDriverNoopContainerReader
  387. decDriverNoopNumberHelper
  388. noBuiltInTypes
  389. h *BincHandle
  390. bincDecState
  391. d Decoder
  392. }
  393. func (d *bincDecDriver) decoder() *Decoder {
  394. return &d.d
  395. }
  396. func (d *bincDecDriver) descBd() string {
  397. return sprintf("%v (%s)", d.bd, bincdescbd(d.bd))
  398. }
  399. func (d *bincDecDriver) readNextBd() {
  400. d.bd = d.d.decRd.readn1()
  401. d.vd = d.bd >> 4
  402. d.vs = d.bd & 0x0f
  403. d.bdRead = true
  404. }
  405. func (d *bincDecDriver) advanceNil() (null bool) {
  406. if !d.bdRead {
  407. d.readNextBd()
  408. }
  409. if d.bd == bincBdNil {
  410. d.bdRead = false
  411. return true // null = true
  412. }
  413. return
  414. }
  415. func (d *bincDecDriver) TryNil() bool {
  416. return d.advanceNil()
  417. }
  418. func (d *bincDecDriver) ContainerType() (vt valueType) {
  419. if !d.bdRead {
  420. d.readNextBd()
  421. }
  422. if d.bd == bincBdNil {
  423. d.bdRead = false
  424. return valueTypeNil
  425. } else if d.vd == bincVdByteArray {
  426. return valueTypeBytes
  427. } else if d.vd == bincVdString {
  428. return valueTypeString
  429. } else if d.vd == bincVdArray {
  430. return valueTypeArray
  431. } else if d.vd == bincVdMap {
  432. return valueTypeMap
  433. }
  434. return valueTypeUnset
  435. }
  436. func (d *bincDecDriver) DecodeTime() (t time.Time) {
  437. if d.advanceNil() {
  438. return
  439. }
  440. if d.vd != bincVdTimestamp {
  441. d.d.errorf("cannot decode time - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  442. }
  443. t, err := bincDecodeTime(d.d.decRd.readx(uint(d.vs)))
  444. halt.onerror(err)
  445. d.bdRead = false
  446. return
  447. }
  448. func (d *bincDecDriver) decFloatPruned(maxlen uint8) {
  449. l := d.d.decRd.readn1()
  450. if l > maxlen {
  451. d.d.errorf("cannot read float - at most %v bytes used to represent float - received %v bytes", maxlen, l)
  452. }
  453. for i := l; i < maxlen; i++ {
  454. d.d.b[i] = 0
  455. }
  456. d.d.decRd.readb(d.d.b[0:l])
  457. }
  458. func (d *bincDecDriver) decFloatPre32() (b [4]byte) {
  459. if d.vs&0x8 == 0 {
  460. b = d.d.decRd.readn4()
  461. } else {
  462. d.decFloatPruned(4)
  463. copy(b[:], d.d.b[:])
  464. }
  465. return
  466. }
  467. func (d *bincDecDriver) decFloatPre64() (b [8]byte) {
  468. if d.vs&0x8 == 0 {
  469. b = d.d.decRd.readn8()
  470. } else {
  471. d.decFloatPruned(8)
  472. copy(b[:], d.d.b[:])
  473. }
  474. return
  475. }
  476. func (d *bincDecDriver) decFloatVal() (f float64) {
  477. switch d.vs & 0x7 {
  478. case bincFlBin32:
  479. f = float64(math.Float32frombits(bigen.Uint32(d.decFloatPre32())))
  480. case bincFlBin64:
  481. f = math.Float64frombits(bigen.Uint64(d.decFloatPre64()))
  482. default:
  483. // ok = false
  484. d.d.errorf("read float supports only float32/64 - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  485. }
  486. return
  487. }
  488. func (d *bincDecDriver) decUint() (v uint64) {
  489. switch d.vs {
  490. case 0:
  491. v = uint64(d.d.decRd.readn1())
  492. case 1:
  493. v = uint64(bigen.Uint16(d.d.decRd.readn2()))
  494. case 2:
  495. v = uint64(bigen.Uint32(d.d.decRd.readn3()))
  496. case 3:
  497. v = uint64(bigen.Uint32(d.d.decRd.readn4()))
  498. case 4, 5, 6:
  499. var b [8]byte
  500. lim := 7 - d.vs
  501. bs := d.d.b[lim:8]
  502. d.d.decRd.readb(bs)
  503. copy(b[lim:], bs)
  504. v = bigen.Uint64(b)
  505. case 7:
  506. v = bigen.Uint64(d.d.decRd.readn8())
  507. default:
  508. d.d.errorf("unsigned integers with greater than 64 bits of precision not supported: d.vs: %v %x", d.vs, d.vs)
  509. }
  510. return
  511. }
  512. func (d *bincDecDriver) uintBytes() (bs []byte) {
  513. switch d.vs {
  514. case 0:
  515. bs = d.d.b[:1]
  516. bs[0] = d.d.decRd.readn1()
  517. case 1:
  518. bs = d.d.b[:2]
  519. d.d.decRd.readb(bs)
  520. case 2:
  521. bs = d.d.b[:3]
  522. d.d.decRd.readb(bs)
  523. case 3:
  524. bs = d.d.b[:4]
  525. d.d.decRd.readb(bs)
  526. case 4, 5, 6:
  527. lim := 7 - d.vs
  528. bs = d.d.b[lim:8]
  529. d.d.decRd.readb(bs)
  530. case 7:
  531. bs = d.d.b[:8]
  532. d.d.decRd.readb(bs)
  533. default:
  534. d.d.errorf("unsigned integers with greater than 64 bits of precision not supported: d.vs: %v %x", d.vs, d.vs)
  535. }
  536. return
  537. }
  538. func (d *bincDecDriver) decInteger() (ui uint64, neg, ok bool) {
  539. ok = true
  540. vd, vs := d.vd, d.vs
  541. if vd == bincVdPosInt {
  542. ui = d.decUint()
  543. } else if vd == bincVdNegInt {
  544. ui = d.decUint()
  545. neg = true
  546. } else if vd == bincVdSmallInt {
  547. ui = uint64(d.vs) + 1
  548. } else if vd == bincVdSpecial {
  549. if vs == bincSpZero {
  550. // i = 0
  551. } else if vs == bincSpNegOne {
  552. neg = true
  553. ui = 1
  554. } else {
  555. ok = false
  556. // d.d.errorf("integer decode has invalid special value %x-%x/%s", d.vd, d.vs, bincdesc(d.vd, d.vs))
  557. }
  558. } else {
  559. ok = false
  560. // d.d.errorf("integer can only be decoded from int/uint. d.bd: 0x%x, d.vd: 0x%x", d.bd, d.vd)
  561. }
  562. return
  563. }
  564. func (d *bincDecDriver) decFloat() (f float64, ok bool) {
  565. ok = true
  566. vd, vs := d.vd, d.vs
  567. if vd == bincVdSpecial {
  568. if vs == bincSpNan {
  569. f = math.NaN()
  570. } else if vs == bincSpPosInf {
  571. f = math.Inf(1)
  572. } else if vs == bincSpZeroFloat || vs == bincSpZero {
  573. } else if vs == bincSpNegInf {
  574. f = math.Inf(-1)
  575. } else {
  576. ok = false
  577. // d.d.errorf("float - invalid special value %x-%x/%s", d.vd, d.vs, bincdesc(d.vd, d.vs))
  578. }
  579. } else if vd == bincVdFloat {
  580. f = d.decFloatVal()
  581. } else {
  582. ok = false
  583. }
  584. return
  585. }
  586. func (d *bincDecDriver) DecodeInt64() (i int64) {
  587. if d.advanceNil() {
  588. return
  589. }
  590. i = decNegintPosintFloatNumberHelper{&d.d}.int64(d.decInteger())
  591. d.bdRead = false
  592. return
  593. }
  594. func (d *bincDecDriver) DecodeUint64() (ui uint64) {
  595. if d.advanceNil() {
  596. return
  597. }
  598. ui = decNegintPosintFloatNumberHelper{&d.d}.uint64(d.decInteger())
  599. d.bdRead = false
  600. return
  601. }
  602. func (d *bincDecDriver) DecodeFloat64() (f float64) {
  603. if d.advanceNil() {
  604. return
  605. }
  606. f = decNegintPosintFloatNumberHelper{&d.d}.float64(d.decFloat())
  607. d.bdRead = false
  608. return
  609. }
  610. func (d *bincDecDriver) DecodeBool() (b bool) {
  611. if d.advanceNil() {
  612. return
  613. }
  614. if d.bd == (bincVdSpecial | bincSpFalse) {
  615. // b = false
  616. } else if d.bd == (bincVdSpecial | bincSpTrue) {
  617. b = true
  618. } else {
  619. d.d.errorf("bool - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  620. }
  621. d.bdRead = false
  622. return
  623. }
  624. func (d *bincDecDriver) ReadMapStart() (length int) {
  625. if d.advanceNil() {
  626. return containerLenNil
  627. }
  628. if d.vd != bincVdMap {
  629. d.d.errorf("map - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  630. }
  631. length = d.decLen()
  632. d.bdRead = false
  633. return
  634. }
  635. func (d *bincDecDriver) ReadArrayStart() (length int) {
  636. if d.advanceNil() {
  637. return containerLenNil
  638. }
  639. if d.vd != bincVdArray {
  640. d.d.errorf("array - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  641. }
  642. length = d.decLen()
  643. d.bdRead = false
  644. return
  645. }
  646. func (d *bincDecDriver) decLen() int {
  647. if d.vs > 3 {
  648. return int(d.vs - 4)
  649. }
  650. return int(d.decLenNumber())
  651. }
  652. func (d *bincDecDriver) decLenNumber() (v uint64) {
  653. if x := d.vs; x == 0 {
  654. v = uint64(d.d.decRd.readn1())
  655. } else if x == 1 {
  656. v = uint64(bigen.Uint16(d.d.decRd.readn2()))
  657. } else if x == 2 {
  658. v = uint64(bigen.Uint32(d.d.decRd.readn4()))
  659. } else {
  660. v = bigen.Uint64(d.d.decRd.readn8())
  661. }
  662. return
  663. }
  664. // func (d *bincDecDriver) decStringBytes(bs []byte, zerocopy bool) (bs2 []byte) {
  665. func (d *bincDecDriver) DecodeStringAsBytes() (bs2 []byte) {
  666. d.d.decByteState = decByteStateNone
  667. if d.advanceNil() {
  668. return
  669. }
  670. var slen = -1
  671. switch d.vd {
  672. case bincVdString, bincVdByteArray:
  673. slen = d.decLen()
  674. if d.d.bytes {
  675. d.d.decByteState = decByteStateZerocopy
  676. bs2 = d.d.decRd.rb.readx(uint(slen))
  677. } else {
  678. d.d.decByteState = decByteStateReuseBuf
  679. bs2 = decByteSlice(d.d.r(), slen, d.d.h.MaxInitLen, d.d.b[:])
  680. }
  681. case bincVdSymbol:
  682. // zerocopy doesn't apply for symbols,
  683. // as the values must be stored in a table for later use.
  684. var symbol uint16
  685. vs := d.vs
  686. if vs&0x8 == 0 {
  687. symbol = uint16(d.d.decRd.readn1())
  688. } else {
  689. symbol = uint16(bigen.Uint16(d.d.decRd.readn2()))
  690. }
  691. if d.s == nil {
  692. d.s = make(map[uint16][]byte, 16)
  693. }
  694. if vs&0x4 == 0 {
  695. bs2 = d.s[symbol]
  696. } else {
  697. switch vs & 0x3 {
  698. case 0:
  699. slen = int(d.d.decRd.readn1())
  700. case 1:
  701. slen = int(bigen.Uint16(d.d.decRd.readn2()))
  702. case 2:
  703. slen = int(bigen.Uint32(d.d.decRd.readn4()))
  704. case 3:
  705. slen = int(bigen.Uint64(d.d.decRd.readn8()))
  706. }
  707. // As we are using symbols, do not store any part of
  708. // the parameter bs in the map, as it might be a shared buffer.
  709. bs2 = decByteSlice(d.d.r(), slen, d.d.h.MaxInitLen, nil)
  710. d.s[symbol] = bs2
  711. }
  712. default:
  713. d.d.errorf("string/bytes - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  714. }
  715. d.bdRead = false
  716. return
  717. }
  718. func (d *bincDecDriver) DecodeBytes(bs []byte) (bsOut []byte) {
  719. d.d.decByteState = decByteStateNone
  720. if d.advanceNil() {
  721. return
  722. }
  723. if d.vd == bincVdArray {
  724. if bs == nil {
  725. bs = d.d.b[:]
  726. d.d.decByteState = decByteStateReuseBuf
  727. }
  728. slen := d.ReadArrayStart()
  729. var changed bool
  730. if bs, changed = usableByteSlice(bs, slen); changed {
  731. d.d.decByteState = decByteStateNone
  732. }
  733. for i := 0; i < slen; i++ {
  734. bs[i] = uint8(chkOvf.UintV(d.DecodeUint64(), 8))
  735. }
  736. for i := len(bs); i < slen; i++ {
  737. bs = append(bs, uint8(chkOvf.UintV(d.DecodeUint64(), 8)))
  738. }
  739. return bs
  740. }
  741. var clen int
  742. if d.vd == bincVdString || d.vd == bincVdByteArray {
  743. clen = d.decLen()
  744. } else {
  745. d.d.errorf("bytes - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  746. }
  747. d.bdRead = false
  748. if d.d.zerocopy() {
  749. d.d.decByteState = decByteStateZerocopy
  750. return d.d.decRd.rb.readx(uint(clen))
  751. }
  752. if bs == nil {
  753. bs = d.d.b[:]
  754. d.d.decByteState = decByteStateReuseBuf
  755. }
  756. return decByteSlice(d.d.r(), clen, d.d.h.MaxInitLen, bs)
  757. }
  758. func (d *bincDecDriver) DecodeExt(rv interface{}, basetype reflect.Type, xtag uint64, ext Ext) {
  759. if xtag > 0xff {
  760. d.d.errorf("ext: tag must be <= 0xff; got: %v", xtag)
  761. }
  762. if d.advanceNil() {
  763. return
  764. }
  765. xbs, realxtag1, zerocopy := d.decodeExtV(ext != nil, uint8(xtag))
  766. realxtag := uint64(realxtag1)
  767. if ext == nil {
  768. re := rv.(*RawExt)
  769. re.Tag = realxtag
  770. re.setData(xbs, zerocopy)
  771. } else if ext == SelfExt {
  772. d.d.sideDecode(rv, basetype, xbs)
  773. } else {
  774. ext.ReadExt(rv, xbs)
  775. }
  776. }
  777. func (d *bincDecDriver) decodeExtV(verifyTag bool, tag byte) (xbs []byte, xtag byte, zerocopy bool) {
  778. if d.vd == bincVdCustomExt {
  779. l := d.decLen()
  780. xtag = d.d.decRd.readn1()
  781. if verifyTag && xtag != tag {
  782. d.d.errorf("wrong extension tag - got %b, expecting: %v", xtag, tag)
  783. }
  784. if d.d.bytes {
  785. xbs = d.d.decRd.rb.readx(uint(l))
  786. zerocopy = true
  787. } else {
  788. xbs = decByteSlice(d.d.r(), l, d.d.h.MaxInitLen, d.d.b[:])
  789. }
  790. } else if d.vd == bincVdByteArray {
  791. xbs = d.DecodeBytes(nil)
  792. } else {
  793. d.d.errorf("ext expects extensions or byte array - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  794. }
  795. d.bdRead = false
  796. return
  797. }
  798. func (d *bincDecDriver) DecodeNaked() {
  799. if !d.bdRead {
  800. d.readNextBd()
  801. }
  802. n := d.d.naked()
  803. var decodeFurther bool
  804. switch d.vd {
  805. case bincVdSpecial:
  806. switch d.vs {
  807. case bincSpNil:
  808. n.v = valueTypeNil
  809. case bincSpFalse:
  810. n.v = valueTypeBool
  811. n.b = false
  812. case bincSpTrue:
  813. n.v = valueTypeBool
  814. n.b = true
  815. case bincSpNan:
  816. n.v = valueTypeFloat
  817. n.f = math.NaN()
  818. case bincSpPosInf:
  819. n.v = valueTypeFloat
  820. n.f = math.Inf(1)
  821. case bincSpNegInf:
  822. n.v = valueTypeFloat
  823. n.f = math.Inf(-1)
  824. case bincSpZeroFloat:
  825. n.v = valueTypeFloat
  826. n.f = float64(0)
  827. case bincSpZero:
  828. n.v = valueTypeUint
  829. n.u = uint64(0) // int8(0)
  830. case bincSpNegOne:
  831. n.v = valueTypeInt
  832. n.i = int64(-1) // int8(-1)
  833. default:
  834. d.d.errorf("cannot infer value - unrecognized special value %x-%x/%s", d.vd, d.vs, bincdesc(d.vd, d.vs))
  835. }
  836. case bincVdSmallInt:
  837. n.v = valueTypeUint
  838. n.u = uint64(int8(d.vs)) + 1 // int8(d.vs) + 1
  839. case bincVdPosInt:
  840. n.v = valueTypeUint
  841. n.u = d.decUint()
  842. case bincVdNegInt:
  843. n.v = valueTypeInt
  844. n.i = -(int64(d.decUint()))
  845. case bincVdFloat:
  846. n.v = valueTypeFloat
  847. n.f = d.decFloatVal()
  848. case bincVdString:
  849. n.v = valueTypeString
  850. n.s = d.d.stringZC(d.DecodeStringAsBytes())
  851. case bincVdByteArray:
  852. d.d.fauxUnionReadRawBytes(false)
  853. case bincVdSymbol:
  854. n.v = valueTypeSymbol
  855. n.s = d.d.stringZC(d.DecodeStringAsBytes())
  856. case bincVdTimestamp:
  857. n.v = valueTypeTime
  858. tt, err := bincDecodeTime(d.d.decRd.readx(uint(d.vs)))
  859. halt.onerror(err)
  860. n.t = tt
  861. case bincVdCustomExt:
  862. n.v = valueTypeExt
  863. l := d.decLen()
  864. n.u = uint64(d.d.decRd.readn1())
  865. if d.d.bytes {
  866. n.l = d.d.decRd.rb.readx(uint(l))
  867. } else {
  868. n.l = decByteSlice(d.d.r(), l, d.d.h.MaxInitLen, d.d.b[:])
  869. }
  870. case bincVdArray:
  871. n.v = valueTypeArray
  872. decodeFurther = true
  873. case bincVdMap:
  874. n.v = valueTypeMap
  875. decodeFurther = true
  876. default:
  877. d.d.errorf("cannot infer value - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  878. }
  879. if !decodeFurther {
  880. d.bdRead = false
  881. }
  882. if n.v == valueTypeUint && d.h.SignedInteger {
  883. n.v = valueTypeInt
  884. n.i = int64(n.u)
  885. }
  886. }
  887. func (d *bincDecDriver) nextValueBytes(v0 []byte) (v []byte) {
  888. if !d.bdRead {
  889. d.readNextBd()
  890. }
  891. v = v0
  892. var h = decNextValueBytesHelper{d: &d.d}
  893. var cursor = d.d.rb.c - 1
  894. h.append1(&v, d.bd)
  895. v = d.nextValueBytesBdReadR(v)
  896. d.bdRead = false
  897. h.bytesRdV(&v, cursor)
  898. return
  899. }
  900. func (d *bincDecDriver) nextValueBytesR(v0 []byte) (v []byte) {
  901. d.readNextBd()
  902. v = v0
  903. var h = decNextValueBytesHelper{d: &d.d}
  904. h.append1(&v, d.bd)
  905. return d.nextValueBytesBdReadR(v)
  906. }
  907. func (d *bincDecDriver) nextValueBytesBdReadR(v0 []byte) (v []byte) {
  908. v = v0
  909. var h = decNextValueBytesHelper{d: &d.d}
  910. fnLen := func(vs byte) uint {
  911. switch vs {
  912. case 0:
  913. x := d.d.decRd.readn1()
  914. h.append1(&v, x)
  915. return uint(x)
  916. case 1:
  917. x := d.d.decRd.readn2()
  918. h.appendN(&v, x[:]...)
  919. return uint(bigen.Uint16(x))
  920. case 2:
  921. x := d.d.decRd.readn4()
  922. h.appendN(&v, x[:]...)
  923. return uint(bigen.Uint32(x))
  924. case 3:
  925. x := d.d.decRd.readn8()
  926. h.appendN(&v, x[:]...)
  927. return uint(bigen.Uint64(x))
  928. default:
  929. return uint(vs - 4)
  930. }
  931. }
  932. var clen uint
  933. switch d.vd {
  934. case bincVdSpecial:
  935. switch d.vs {
  936. case bincSpNil, bincSpFalse, bincSpTrue, bincSpNan, bincSpPosInf: // pass
  937. case bincSpNegInf, bincSpZeroFloat, bincSpZero, bincSpNegOne: // pass
  938. default:
  939. d.d.errorf("cannot infer value - unrecognized special value %x-%x/%s", d.vd, d.vs, bincdesc(d.vd, d.vs))
  940. }
  941. case bincVdSmallInt: // pass
  942. case bincVdPosInt, bincVdNegInt:
  943. bs := d.uintBytes()
  944. h.appendN(&v, bs...)
  945. case bincVdFloat:
  946. fn := func(xlen byte) {
  947. if d.vs&0x8 != 0 {
  948. xlen = d.d.decRd.readn1()
  949. h.append1(&v, xlen)
  950. if xlen > 8 {
  951. d.d.errorf("cannot read float - at most 8 bytes used to represent float - received %v bytes", xlen)
  952. }
  953. }
  954. d.d.decRd.readb(d.d.b[:xlen])
  955. h.appendN(&v, d.d.b[:xlen]...)
  956. }
  957. switch d.vs & 0x7 {
  958. case bincFlBin32:
  959. fn(4)
  960. case bincFlBin64:
  961. fn(8)
  962. default:
  963. d.d.errorf("read float supports only float32/64 - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  964. }
  965. case bincVdString, bincVdByteArray:
  966. clen = fnLen(d.vs)
  967. h.appendN(&v, d.d.decRd.readx(clen)...)
  968. case bincVdSymbol:
  969. if d.vs&0x8 == 0 {
  970. h.append1(&v, d.d.decRd.readn1())
  971. } else {
  972. h.appendN(&v, d.d.decRd.rb.readx(2)...)
  973. }
  974. if d.vs&0x4 != 0 {
  975. clen = fnLen(d.vs & 0x3)
  976. h.appendN(&v, d.d.decRd.readx(clen)...)
  977. }
  978. case bincVdTimestamp:
  979. h.appendN(&v, d.d.decRd.readx(uint(d.vs))...)
  980. case bincVdCustomExt:
  981. clen = fnLen(d.vs)
  982. h.append1(&v, d.d.decRd.readn1()) // tag
  983. h.appendN(&v, d.d.decRd.readx(clen)...)
  984. case bincVdArray:
  985. clen = fnLen(d.vs)
  986. for i := uint(0); i < clen; i++ {
  987. v = d.nextValueBytesR(v)
  988. }
  989. case bincVdMap:
  990. clen = fnLen(d.vs)
  991. for i := uint(0); i < clen; i++ {
  992. v = d.nextValueBytesR(v)
  993. v = d.nextValueBytesR(v)
  994. }
  995. default:
  996. d.d.errorf("cannot infer value - %s %x-%x/%s", msgBadDesc, d.vd, d.vs, bincdesc(d.vd, d.vs))
  997. }
  998. return
  999. }
  1000. //------------------------------------
  1001. //BincHandle is a Handle for the Binc Schema-Free Encoding Format
  1002. //defined at https://github.com/ugorji/binc .
  1003. //
  1004. //BincHandle currently supports all Binc features with the following EXCEPTIONS:
  1005. // - only integers up to 64 bits of precision are supported.
  1006. // big integers are unsupported.
  1007. // - Only IEEE 754 binary32 and binary64 floats are supported (ie Go float32 and float64 types).
  1008. // extended precision and decimal IEEE 754 floats are unsupported.
  1009. // - Only UTF-8 strings supported.
  1010. // Unicode_Other Binc types (UTF16, UTF32) are currently unsupported.
  1011. //
  1012. //Note that these EXCEPTIONS are temporary and full support is possible and may happen soon.
  1013. type BincHandle struct {
  1014. BasicHandle
  1015. binaryEncodingType
  1016. // noElemSeparators
  1017. // AsSymbols defines what should be encoded as symbols.
  1018. //
  1019. // Encoding as symbols can reduce the encoded size significantly.
  1020. //
  1021. // However, during decoding, each string to be encoded as a symbol must
  1022. // be checked to see if it has been seen before. Consequently, encoding time
  1023. // will increase if using symbols, because string comparisons has a clear cost.
  1024. //
  1025. // Values:
  1026. // - 0: default: library uses best judgement
  1027. // - 1: use symbols
  1028. // - 2: do not use symbols
  1029. AsSymbols uint8
  1030. // AsSymbols: may later on introduce more options ...
  1031. // - m: map keys
  1032. // - s: struct fields
  1033. // - n: none
  1034. // - a: all: same as m, s, ...
  1035. // _ [7]uint64 // padding (cache-aligned)
  1036. }
  1037. // Name returns the name of the handle: binc
  1038. func (h *BincHandle) Name() string { return "binc" }
  1039. func (h *BincHandle) desc(bd byte) string { return bincdesc(bd>>4, bd&0x0f) }
  1040. func (h *BincHandle) newEncDriver() encDriver {
  1041. var e = &bincEncDriver{h: h}
  1042. e.e.e = e
  1043. e.e.init(h)
  1044. e.reset()
  1045. return e
  1046. }
  1047. func (h *BincHandle) newDecDriver() decDriver {
  1048. d := &bincDecDriver{h: h}
  1049. d.d.d = d
  1050. d.d.init(h)
  1051. d.reset()
  1052. return d
  1053. }
  1054. // var timeDigits = [...]byte{'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
  1055. // EncodeTime encodes a time.Time as a []byte, including
  1056. // information on the instant in time and UTC offset.
  1057. //
  1058. // Format Description
  1059. //
  1060. // A timestamp is composed of 3 components:
  1061. //
  1062. // - secs: signed integer representing seconds since unix epoch
  1063. // - nsces: unsigned integer representing fractional seconds as a
  1064. // nanosecond offset within secs, in the range 0 <= nsecs < 1e9
  1065. // - tz: signed integer representing timezone offset in minutes east of UTC,
  1066. // and a dst (daylight savings time) flag
  1067. //
  1068. // When encoding a timestamp, the first byte is the descriptor, which
  1069. // defines which components are encoded and how many bytes are used to
  1070. // encode secs and nsecs components. *If secs/nsecs is 0 or tz is UTC, it
  1071. // is not encoded in the byte array explicitly*.
  1072. //
  1073. // Descriptor 8 bits are of the form `A B C DDD EE`:
  1074. // A: Is secs component encoded? 1 = true
  1075. // B: Is nsecs component encoded? 1 = true
  1076. // C: Is tz component encoded? 1 = true
  1077. // DDD: Number of extra bytes for secs (range 0-7).
  1078. // If A = 1, secs encoded in DDD+1 bytes.
  1079. // If A = 0, secs is not encoded, and is assumed to be 0.
  1080. // If A = 1, then we need at least 1 byte to encode secs.
  1081. // DDD says the number of extra bytes beyond that 1.
  1082. // E.g. if DDD=0, then secs is represented in 1 byte.
  1083. // if DDD=2, then secs is represented in 3 bytes.
  1084. // EE: Number of extra bytes for nsecs (range 0-3).
  1085. // If B = 1, nsecs encoded in EE+1 bytes (similar to secs/DDD above)
  1086. //
  1087. // Following the descriptor bytes, subsequent bytes are:
  1088. //
  1089. // secs component encoded in `DDD + 1` bytes (if A == 1)
  1090. // nsecs component encoded in `EE + 1` bytes (if B == 1)
  1091. // tz component encoded in 2 bytes (if C == 1)
  1092. //
  1093. // secs and nsecs components are integers encoded in a BigEndian
  1094. // 2-complement encoding format.
  1095. //
  1096. // tz component is encoded as 2 bytes (16 bits). Most significant bit 15 to
  1097. // Least significant bit 0 are described below:
  1098. //
  1099. // Timezone offset has a range of -12:00 to +14:00 (ie -720 to +840 minutes).
  1100. // Bit 15 = have\_dst: set to 1 if we set the dst flag.
  1101. // Bit 14 = dst\_on: set to 1 if dst is in effect at the time, or 0 if not.
  1102. // Bits 13..0 = timezone offset in minutes. It is a signed integer in Big Endian format.
  1103. //
  1104. func bincEncodeTime(t time.Time) []byte {
  1105. // t := rv2i(rv).(time.Time)
  1106. tsecs, tnsecs := t.Unix(), t.Nanosecond()
  1107. var (
  1108. bd byte
  1109. bs [16]byte
  1110. i int = 1
  1111. )
  1112. l := t.Location()
  1113. if l == time.UTC {
  1114. l = nil
  1115. }
  1116. if tsecs != 0 {
  1117. bd = bd | 0x80
  1118. btmp := bigen.PutUint64(uint64(tsecs))
  1119. f := pruneSignExt(btmp[:], tsecs >= 0)
  1120. bd = bd | (byte(7-f) << 2)
  1121. copy(bs[i:], btmp[f:])
  1122. i = i + (8 - f)
  1123. }
  1124. if tnsecs != 0 {
  1125. bd = bd | 0x40
  1126. btmp := bigen.PutUint32(uint32(tnsecs))
  1127. f := pruneSignExt(btmp[:4], true)
  1128. bd = bd | byte(3-f)
  1129. copy(bs[i:], btmp[f:4])
  1130. i = i + (4 - f)
  1131. }
  1132. if l != nil {
  1133. bd = bd | 0x20
  1134. // Note that Go Libs do not give access to dst flag.
  1135. _, zoneOffset := t.Zone()
  1136. // zoneName, zoneOffset := t.Zone()
  1137. zoneOffset /= 60
  1138. z := uint16(zoneOffset)
  1139. btmp := bigen.PutUint16(z)
  1140. // clear dst flags
  1141. bs[i] = btmp[0] & 0x3f
  1142. bs[i+1] = btmp[1]
  1143. i = i + 2
  1144. }
  1145. bs[0] = bd
  1146. return bs[0:i]
  1147. }
  1148. // bincDecodeTime decodes a []byte into a time.Time.
  1149. func bincDecodeTime(bs []byte) (tt time.Time, err error) {
  1150. bd := bs[0]
  1151. var (
  1152. tsec int64
  1153. tnsec uint32
  1154. tz uint16
  1155. i byte = 1
  1156. i2 byte
  1157. n byte
  1158. )
  1159. if bd&(1<<7) != 0 {
  1160. var btmp [8]byte
  1161. n = ((bd >> 2) & 0x7) + 1
  1162. i2 = i + n
  1163. copy(btmp[8-n:], bs[i:i2])
  1164. // if first bit of bs[i] is set, then fill btmp[0..8-n] with 0xff (ie sign extend it)
  1165. if bs[i]&(1<<7) != 0 {
  1166. copy(btmp[0:8-n], bsAll0xff)
  1167. }
  1168. i = i2
  1169. tsec = int64(bigen.Uint64(btmp))
  1170. }
  1171. if bd&(1<<6) != 0 {
  1172. var btmp [4]byte
  1173. n = (bd & 0x3) + 1
  1174. i2 = i + n
  1175. copy(btmp[4-n:], bs[i:i2])
  1176. i = i2
  1177. tnsec = bigen.Uint32(btmp)
  1178. }
  1179. if bd&(1<<5) == 0 {
  1180. tt = time.Unix(tsec, int64(tnsec)).UTC()
  1181. return
  1182. }
  1183. // In stdlib time.Parse, when a date is parsed without a zone name, it uses "" as zone name.
  1184. // However, we need name here, so it can be shown when time is printf.d.
  1185. // Zone name is in form: UTC-08:00.
  1186. // Note that Go Libs do not give access to dst flag, so we ignore dst bits
  1187. tz = bigen.Uint16([2]byte{bs[i], bs[i+1]})
  1188. // sign extend sign bit into top 2 MSB (which were dst bits):
  1189. if tz&(1<<13) == 0 { // positive
  1190. tz = tz & 0x3fff //clear 2 MSBs: dst bits
  1191. } else { // negative
  1192. tz = tz | 0xc000 //set 2 MSBs: dst bits
  1193. }
  1194. tzint := int16(tz)
  1195. if tzint == 0 {
  1196. tt = time.Unix(tsec, int64(tnsec)).UTC()
  1197. } else {
  1198. // For Go Time, do not use a descriptive timezone.
  1199. // It's unnecessary, and makes it harder to do a reflect.DeepEqual.
  1200. // The Offset already tells what the offset should be, if not on UTC and unknown zone name.
  1201. // var zoneName = timeLocUTCName(tzint)
  1202. tt = time.Unix(tsec, int64(tnsec)).In(time.FixedZone("", int(tzint)*60))
  1203. }
  1204. return
  1205. }
  1206. var _ decDriver = (*bincDecDriver)(nil)
  1207. var _ encDriver = (*bincEncDriver)(nil)