binc.go 32 KB

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