github.com/keygen-sh/go-update@v1.0.0/internal/binarydist/encoding.go (about) 1 package binarydist 2 3 // SignMagLittleEndian is the numeric encoding used by the bsdiff tools. 4 // It implements binary.ByteOrder using a sign-magnitude format 5 // and little-endian byte order. Only methods Uint64 and String 6 // have been written; the rest panic. 7 type signMagLittleEndian struct{} 8 9 func (signMagLittleEndian) Uint16(b []byte) uint16 { panic("unimplemented") } 10 11 func (signMagLittleEndian) PutUint16(b []byte, v uint16) { panic("unimplemented") } 12 13 func (signMagLittleEndian) Uint32(b []byte) uint32 { panic("unimplemented") } 14 15 func (signMagLittleEndian) PutUint32(b []byte, v uint32) { panic("unimplemented") } 16 17 func (signMagLittleEndian) Uint64(b []byte) uint64 { 18 y := int64(b[0]) | 19 int64(b[1])<<8 | 20 int64(b[2])<<16 | 21 int64(b[3])<<24 | 22 int64(b[4])<<32 | 23 int64(b[5])<<40 | 24 int64(b[6])<<48 | 25 int64(b[7]&0x7f)<<56 26 27 if b[7]&0x80 != 0 { 28 y = -y 29 } 30 return uint64(y) 31 } 32 33 func (signMagLittleEndian) PutUint64(b []byte, v uint64) { 34 x := int64(v) 35 neg := x < 0 36 if neg { 37 x = -x 38 } 39 40 b[0] = byte(x) 41 b[1] = byte(x >> 8) 42 b[2] = byte(x >> 16) 43 b[3] = byte(x >> 24) 44 b[4] = byte(x >> 32) 45 b[5] = byte(x >> 40) 46 b[6] = byte(x >> 48) 47 b[7] = byte(x >> 56) 48 if neg { 49 b[7] |= 0x80 50 } 51 } 52 53 func (signMagLittleEndian) String() string { return "signMagLittleEndian" }