package ber func unmarshalInt(b []byte) (i int64) { neg := b[0]&0x80 != 0 for n, v := range b { if neg { v = ^v } i += int64(v) << uint((len(b)-n-1)*8) } if neg { i = ^i } return } func unmarshalUint(b []byte) (i uint64) { for n, v := range b { i += uint64(v) << uint(n*8) } return } func UnmarshalInt(b []byte) int { return int(unmarshalInt(b)) } func intLen(i int64) (n int) { for i > 255 { n++ i >>= 8 } for i < -256 { n++ i >>= 8 } return n + 1 } func marshalInt(i int64) (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 } func MarshalInt(i int) []byte { return marshalInt(int64(i)) }