package ber func UnmarshalInt(b []byte) (i int) { neg := b[0]&0x80 != 0 for n, v := range b { if neg { v = ^v } i += int(v) << uint((len(b)-n-1)*8) } if neg { i = ^i } return } func UnmarshalUint(b []byte) (i uint) { for n, v := range b { i += uint(v) << uint(n*8) } return } func intLen(i int) (n int) { for i > 255 { n++ i >>= 8 } for i < -256 { n++ i >>= 8 } return n + 1 } func MarshalInt(i int) (b []byte) { for n := intLen(i); n > 0; n-- { b = append(b, byte(i>>uint((n-1)*8))) } if i > 0 && b[0]&0x80 != 0 { b = append([]byte{0x00}, b...) } if i < 0 && b[0]&0x80 == 0 { b = append([]byte{0xFF}, b...) } return }