90 lines
1.4 KiB
Go
90 lines
1.4 KiB
Go
|
package payload
|
||
|
|
||
|
import "bytes"
|
||
|
|
||
|
func writeBinaryLen(l int64, w *bytes.Buffer) error {
|
||
|
if l <= 0 {
|
||
|
if err := w.WriteByte(0x00); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := w.WriteByte(0xff); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
max := int64(1)
|
||
|
for n := l / 10; n > 0; n /= 10 {
|
||
|
max *= 10
|
||
|
}
|
||
|
for max > 0 {
|
||
|
n := l / max
|
||
|
if err := w.WriteByte(byte(n)); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
l -= n * max
|
||
|
max /= 10
|
||
|
}
|
||
|
return w.WriteByte(0xff)
|
||
|
}
|
||
|
|
||
|
func writeTextLen(l int64, w *bytes.Buffer) error {
|
||
|
if l <= 0 {
|
||
|
if err := w.WriteByte('0'); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
if err := w.WriteByte(':'); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
return nil
|
||
|
}
|
||
|
max := int64(1)
|
||
|
for n := l / 10; n > 0; n /= 10 {
|
||
|
max *= 10
|
||
|
}
|
||
|
for max > 0 {
|
||
|
n := l / max
|
||
|
if err := w.WriteByte(byte(n) + '0'); err != nil {
|
||
|
return err
|
||
|
}
|
||
|
l -= n * max
|
||
|
max /= 10
|
||
|
}
|
||
|
return w.WriteByte(':')
|
||
|
}
|
||
|
|
||
|
func readBinaryLen(r byteReader) (int64, error) {
|
||
|
ret := int64(0)
|
||
|
for {
|
||
|
b, err := r.ReadByte()
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
if b == 0xff {
|
||
|
break
|
||
|
}
|
||
|
if b > 9 {
|
||
|
return 0, errInvalidPayload
|
||
|
}
|
||
|
ret = ret*10 + int64(b)
|
||
|
}
|
||
|
return ret, nil
|
||
|
}
|
||
|
|
||
|
func readTextLen(r byteReader) (int64, error) {
|
||
|
ret := int64(0)
|
||
|
for {
|
||
|
b, err := r.ReadByte()
|
||
|
if err != nil {
|
||
|
return 0, err
|
||
|
}
|
||
|
if b == ':' {
|
||
|
break
|
||
|
}
|
||
|
if b < '0' || b > '9' {
|
||
|
return 0, errInvalidPayload
|
||
|
}
|
||
|
ret = ret*10 + int64(b-'0')
|
||
|
}
|
||
|
return ret, nil
|
||
|
}
|