From 511cf41a779929b5c81b7429c37dc11bd9544182 Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Fri, 25 Sep 2015 20:41:38 +0200 Subject: Rewrite from scratch --- ber/new/unmarshal.go | 83 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 ber/new/unmarshal.go (limited to 'ber/new/unmarshal.go') diff --git a/ber/new/unmarshal.go b/ber/new/unmarshal.go new file mode 100644 index 0000000..9fd27cd --- /dev/null +++ b/ber/new/unmarshal.go @@ -0,0 +1,83 @@ +package ber + +func (s *state) unmarshalLen() int { + b, _ := s.ReadByte() + if b&0x80 == 0 { + return int(b) + } + var n int + for i, v := range s.Next(int(b)) { + n |= int(v) << uint(i*8) + } + return n +} + +func (s *state) unmarshalBase128() int { + var i int + for { + b, err := s.ReadByte() + if err != nil { + return i + } + i = (i << 7) | int(b&0x7f) + if b&0x80 == 0 { + return i + } + } +} + +func (s *state) unmarshalBool() bool { + b := s.next() + return b[0] != 0x00 +} + +func (s *state) unmarshalInt() int { + b := s.next() + neg := b[0]&0x80 != 0 + var i int + for _, v := range b { + if neg { + v = ^v + } + i = (i << 8) | int(v) + } + if neg { + i = ^i + } + return i +} + +func (s *state) unmarshalString() string { + return string(s.next()) +} + +func (s *state) unmarshalOID() OID { + var o OID + if s.Len() < 2 { + return o + } + buf := s.subState() + v := buf.unmarshalBase128() + if v < 80 { + o = OID{v / 40, v % 40} + } else { + o = OID{2, v - 80} + } + for buf.Len() > 0 { + o = append(o, buf.unmarshalBase128()) + } + return o +} + +func (s *state) unmarshalBitString() BitString { + var bs BitString + b := s.next() + pad := int(b[0]) + l := (len(b)-1)*8 - pad + for i := 0; i < l; i++ { + x := 1 + i/8 + y := 7 - uint(i%8) + bs = append(bs, b[x]&(1<