Files
Singbox-For-SBPanel/protocol/sbproxy/utils.go
2026-04-22 00:40:15 +08:00

71 lines
1.2 KiB
Go

package sbproxy
import (
"errors"
"io"
)
func ReadVarInt(r io.Reader) (int32, int, error) {
var val int32
var size int
for {
var b [1]byte
if _, err := r.Read(b[:]); err != nil {
return 0, 0, err
}
d := b[0]
val |= int32(d&0x7F) << (7 * size)
size++
if size > 5 {
return 0, 0, io.ErrUnexpectedEOF
}
if d&0x80 == 0 {
break
}
}
return val, size, nil
}
func WriteVarInt(w io.Writer, val int32) int {
buf := make([]byte, 5)
size := 0
for {
b := byte(val & 0x7F)
val >>= 7
if val != 0 {
b |= 0x80
}
buf[size] = b
size++
if val == 0 {
break
}
}
w.Write(buf[:size])
return size
}
func ReadString(r io.Reader) (string, error) {
length, _, err := ReadVarInt(r)
if err != nil {
return "", err
}
if length < 0 {
return "", errors.New("negative string length")
}
// Guard against unreasonable allocations from malformed packets.
if length > 1<<20 {
return "", errors.New("string too large")
}
buf := make([]byte, length)
if _, err := io.ReadFull(r, buf); err != nil {
return "", err
}
return string(buf), nil
}
func WriteString(w io.Writer, s string) {
WriteVarInt(w, int32(len(s)))
w.Write([]byte(s))
}