File: encoding.go

package info (click to toggle)
golang-github-kr-binarydist 0.1.0-1
  • links: PTS, VCS
  • area: main
  • in suites: bookworm, bullseye, buster, forky, sid, trixie
  • size: 140 kB
  • sloc: makefile: 13
file content (53 lines) | stat: -rw-r--r-- 1,279 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
package binarydist

// SignMagLittleEndian is the numeric encoding used by the bsdiff tools.
// It implements binary.ByteOrder using a sign-magnitude format
// and little-endian byte order. Only methods Uint64 and String
// have been written; the rest panic.
type signMagLittleEndian struct{}

func (signMagLittleEndian) Uint16(b []byte) uint16 { panic("unimplemented") }

func (signMagLittleEndian) PutUint16(b []byte, v uint16) { panic("unimplemented") }

func (signMagLittleEndian) Uint32(b []byte) uint32 { panic("unimplemented") }

func (signMagLittleEndian) PutUint32(b []byte, v uint32) { panic("unimplemented") }

func (signMagLittleEndian) Uint64(b []byte) uint64 {
	y := int64(b[0]) |
		int64(b[1])<<8 |
		int64(b[2])<<16 |
		int64(b[3])<<24 |
		int64(b[4])<<32 |
		int64(b[5])<<40 |
		int64(b[6])<<48 |
		int64(b[7]&0x7f)<<56

	if b[7]&0x80 != 0 {
		y = -y
	}
	return uint64(y)
}

func (signMagLittleEndian) PutUint64(b []byte, v uint64) {
	x := int64(v)
	neg := x < 0
	if neg {
		x = -x
	}

	b[0] = byte(x)
	b[1] = byte(x >> 8)
	b[2] = byte(x >> 16)
	b[3] = byte(x >> 24)
	b[4] = byte(x >> 32)
	b[5] = byte(x >> 40)
	b[6] = byte(x >> 48)
	b[7] = byte(x >> 56)
	if neg {
		b[7] |= 0x80
	}
}

func (signMagLittleEndian) String() string { return "signMagLittleEndian" }