refactor bytes functions

pull/215/head
v2ray 2016-06-26 22:34:48 +02:00
parent d12d5b0593
commit 67ac925ee7
No known key found for this signature in database
GPG Key ID: 7251FFA14BB18169
16 changed files with 78 additions and 64 deletions

View File

@ -3,6 +3,8 @@ package alloc
import ( import (
"io" "io"
"github.com/v2ray/v2ray-core/common/serial"
) )
const ( const (
@ -56,6 +58,16 @@ func (b *Buffer) AppendString(s string) *Buffer {
return b return b
} }
func (b *Buffer) AppendUint16(v uint16) *Buffer {
b.Value = serial.Uint16ToBytes(v, b.Value)
return b
}
func (b *Buffer) AppendUint32(v uint32) *Buffer {
b.Value = serial.Uint32ToBytes(v, b.Value)
return b
}
// Prepend prepends bytes in front of the buffer. Caller must ensure total bytes prepended is // Prepend prepends bytes in front of the buffer. Caller must ensure total bytes prepended is
// no more than 16 bytes. // no more than 16 bytes.
func (b *Buffer) Prepend(data []byte) *Buffer { func (b *Buffer) Prepend(data []byte) *Buffer {
@ -64,6 +76,22 @@ func (b *Buffer) Prepend(data []byte) *Buffer {
return b return b
} }
func (b *Buffer) PrependBytes(data ...byte) *Buffer {
return b.Prepend(data)
}
func (b *Buffer) PrependUint16(v uint16) *Buffer {
b.SliceBack(2)
serial.Uint16ToBytes(v, b.Value[:0])
return b
}
func (b *Buffer) PrependUint32(v uint32) *Buffer {
b.SliceBack(4)
serial.Uint32ToBytes(v, b.Value[:0])
return b
}
// Bytes returns the content bytes of this Buffer. // Bytes returns the content bytes of this Buffer.
func (b *Buffer) Bytes() []byte { func (b *Buffer) Bytes() []byte {
return b.Value return b.Value

View File

@ -46,8 +46,8 @@ func (this Port) Value() uint16 {
} }
// Bytes returns the correspoding bytes of this Port, in big endian order. // Bytes returns the correspoding bytes of this Port, in big endian order.
func (this Port) Bytes() []byte { func (this Port) Bytes(b []byte) []byte {
return serial.Uint16ToBytes(this.Value()) return serial.Uint16ToBytes(this.Value(), b)
} }
// String returns the string presentation of this Port. // String returns the string presentation of this Port.

View File

@ -14,12 +14,11 @@ import (
) )
func hashTimestamp(t protocol.Timestamp) []byte { func hashTimestamp(t protocol.Timestamp) []byte {
once := t.Bytes()
bytes := make([]byte, 0, 32) bytes := make([]byte, 0, 32)
bytes = append(bytes, once...) t.Bytes(bytes)
bytes = append(bytes, once...) t.Bytes(bytes)
bytes = append(bytes, once...) t.Bytes(bytes)
bytes = append(bytes, once...) t.Bytes(bytes)
return bytes return bytes
} }
@ -53,7 +52,7 @@ func NewClientSession(idHash protocol.IDHash) *ClientSession {
func (this *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) { func (this *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, writer io.Writer) {
timestamp := protocol.NewTimestampGenerator(protocol.NowTime(), 30)() timestamp := protocol.NewTimestampGenerator(protocol.NowTime(), 30)()
idHash := this.idHash(header.User.Account.(*protocol.VMessAccount).AnyValidID().Bytes()) idHash := this.idHash(header.User.Account.(*protocol.VMessAccount).AnyValidID().Bytes())
idHash.Write(timestamp.Bytes()) idHash.Write(timestamp.Bytes(nil))
writer.Write(idHash.Sum(nil)) writer.Write(idHash.Sum(nil))
buffer := alloc.NewSmallBuffer().Clear() buffer := alloc.NewSmallBuffer().Clear()
@ -64,7 +63,7 @@ func (this *ClientSession) EncodeRequestHeader(header *protocol.RequestHeader, w
buffer.Append(this.requestBodyKey) buffer.Append(this.requestBodyKey)
buffer.AppendBytes(this.responseHeader, byte(header.Option), byte(0), byte(0)) buffer.AppendBytes(this.responseHeader, byte(header.Option), byte(0), byte(0))
buffer.AppendBytes(byte(header.Command)) buffer.AppendBytes(byte(header.Command))
buffer.Append(header.Port.Bytes()) buffer.AppendUint16(header.Port.Value())
switch { switch {
case header.Address.IsIPv4(): case header.Address.IsIPv4():

View File

@ -94,12 +94,12 @@ func (this *CommandSwitchAccountFactory) Marshal(command interface{}, writer io.
writer.Write([]byte(hostStr)) writer.Write([]byte(hostStr))
} }
writer.Write(cmd.Port.Bytes()) writer.Write(cmd.Port.Bytes(nil))
idBytes := cmd.ID.Bytes() idBytes := cmd.ID.Bytes()
writer.Write(idBytes) writer.Write(idBytes)
writer.Write(serial.Uint16ToBytes(cmd.AlterIds)) writer.Write(serial.Uint16ToBytes(cmd.AlterIds, nil))
writer.Write([]byte{byte(cmd.Level)}) writer.Write([]byte{byte(cmd.Level)})
writer.Write([]byte{cmd.ValidMin}) writer.Write([]byte{cmd.ValidMin})

View File

@ -9,8 +9,8 @@ import (
type Timestamp int64 type Timestamp int64
func (this Timestamp) Bytes() []byte { func (this Timestamp) Bytes(b []byte) []byte {
return serial.Int64ToBytes(int64(this)) return serial.Int64ToBytes(int64(this), b)
} }
type TimestampGenerator func() Timestamp type TimestampGenerator func() Timestamp

View File

@ -83,11 +83,11 @@ func (this *TimedUserValidator) generateNewHashes(nowSec Timestamp, idx int, ent
var hashValueRemoval [16]byte var hashValueRemoval [16]byte
idHash := this.hasher(entry.id.Bytes()) idHash := this.hasher(entry.id.Bytes())
for entry.lastSec <= nowSec { for entry.lastSec <= nowSec {
idHash.Write(entry.lastSec.Bytes()) idHash.Write(entry.lastSec.Bytes(nil))
idHash.Sum(hashValue[:0]) idHash.Sum(hashValue[:0])
idHash.Reset() idHash.Reset()
idHash.Write(entry.lastSecRemoval.Bytes()) idHash.Write(entry.lastSecRemoval.Bytes(nil))
idHash.Sum(hashValueRemoval[:0]) idHash.Sum(hashValueRemoval[:0])
idHash.Reset() idHash.Reset()

View File

@ -10,24 +10,24 @@ func ByteToHexString(value byte) string {
} }
func BytesToUint16(value []byte) uint16 { func BytesToUint16(value []byte) uint16 {
return uint16(value[0])<<8 + uint16(value[1]) return uint16(value[0])<<8 | uint16(value[1])
} }
func BytesToUint32(value []byte) uint32 { func BytesToUint32(value []byte) uint32 {
return uint32(value[0])<<24 + return uint32(value[0])<<24 |
uint32(value[1])<<16 + uint32(value[1])<<16 |
uint32(value[2])<<8 + uint32(value[2])<<8 |
uint32(value[3]) uint32(value[3])
} }
func BytesToInt64(value []byte) int64 { func BytesToInt64(value []byte) int64 {
return int64(value[0])<<56 + return int64(value[0])<<56 |
int64(value[1])<<48 + int64(value[1])<<48 |
int64(value[2])<<40 + int64(value[2])<<40 |
int64(value[3])<<32 + int64(value[3])<<32 |
int64(value[4])<<24 + int64(value[4])<<24 |
int64(value[5])<<16 + int64(value[5])<<16 |
int64(value[6])<<8 + int64(value[6])<<8 |
int64(value[7]) int64(value[7])
} }

View File

@ -4,47 +4,36 @@ import (
"strconv" "strconv"
) )
func Uint16ToBytes(value uint16) []byte { func Uint16ToBytes(value uint16, b []byte) []byte {
return []byte{byte(value >> 8), byte(value)} return append(b, byte(value>>8), byte(value))
} }
func Uint16ToString(value uint16) string { func Uint16ToString(value uint16) string {
return strconv.Itoa(int(value)) return strconv.Itoa(int(value))
} }
func Uint32ToBytes(value uint32) []byte { func Uint32ToBytes(value uint32, b []byte) []byte {
return []byte{ return append(b, byte(value>>24), byte(value>>16), byte(value>>8), byte(value))
byte(value >> 24),
byte(value >> 16),
byte(value >> 8),
byte(value),
}
} }
func IntToBytes(value int) []byte { func IntToBytes(value int, b []byte) []byte {
return []byte{ return append(b, byte(value>>24), byte(value>>16), byte(value>>8), byte(value))
byte(value >> 24),
byte(value >> 16),
byte(value >> 8),
byte(value),
}
} }
func IntToString(value int) string { func IntToString(value int) string {
return Int64ToString(int64(value)) return Int64ToString(int64(value))
} }
func Int64ToBytes(value int64) []byte { func Int64ToBytes(value int64, b []byte) []byte {
return []byte{ return append(b,
byte(value >> 56), byte(value>>56),
byte(value >> 48), byte(value>>48),
byte(value >> 40), byte(value>>40),
byte(value >> 32), byte(value>>32),
byte(value >> 24), byte(value>>24),
byte(value >> 16), byte(value>>16),
byte(value >> 8), byte(value>>8),
byte(value), byte(value))
}
} }
func Int64ToString(value int64) string { func Int64ToString(value int64) string {

View File

@ -49,7 +49,7 @@ func ChunkKeyGenerator(iv []byte) func() []byte {
return func() []byte { return func() []byte {
newKey := make([]byte, 0, len(iv)+4) newKey := make([]byte, 0, len(iv)+4)
newKey = append(newKey, iv...) newKey = append(newKey, iv...)
newKey = append(newKey, serial.IntToBytes(chunkId)...) serial.IntToBytes(chunkId, newKey)
chunkId++ chunkId++
return newKey return newKey
} }

View File

@ -143,7 +143,7 @@ func (this *Server) handlerUDPPayload(payload *alloc.Buffer, source v2net.Destin
writer.Write([]byte(request.Address.Domain())) writer.Write([]byte(request.Address.Domain()))
} }
writer.Write(request.Port.Bytes()) writer.Write(request.Port.Bytes(nil))
writer.Write(payload.Value) writer.Write(payload.Value)
if request.OTA { if request.OTA {

View File

@ -306,5 +306,5 @@ func (r *Socks5Response) Write(writer io.Writer) {
case 0x04: case 0x04:
writer.Write(r.IPv6[:]) writer.Write(r.IPv6[:])
} }
writer.Write(r.Port.Bytes()) writer.Write(r.Port.Bytes(nil))
} }

View File

@ -34,7 +34,7 @@ func (request *Socks5UDPRequest) Write(buffer *alloc.Buffer) {
case request.Address.IsDomain(): case request.Address.IsDomain():
buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))).Append([]byte(request.Address.Domain())) buffer.AppendBytes(AddrTypeDomain, byte(len(request.Address.Domain()))).Append([]byte(request.Address.Domain()))
} }
buffer.Append(request.Port.Bytes()) buffer.AppendUint16(request.Port.Value())
buffer.Append(request.Data.Value) buffer.Append(request.Data.Value)
} }

View File

@ -5,7 +5,6 @@ import (
"github.com/v2ray/v2ray-core/common/alloc" "github.com/v2ray/v2ray-core/common/alloc"
v2io "github.com/v2ray/v2ray-core/common/io" v2io "github.com/v2ray/v2ray-core/common/io"
"github.com/v2ray/v2ray-core/common/serial"
) )
type AuthChunkWriter struct { type AuthChunkWriter struct {
@ -35,5 +34,5 @@ func Authenticate(buffer *alloc.Buffer) {
buffer.SliceBack(4) buffer.SliceBack(4)
fnvHash.Sum(buffer.Value[:0]) fnvHash.Sum(buffer.Value[:0])
buffer.Prepend(serial.Uint16ToBytes(uint16(buffer.Len()))) buffer.PrependUint16(uint16(buffer.Len()))
} }

View File

@ -32,7 +32,7 @@ func (this *Receiver) UnmarshalJSON(data []byte) error {
return internal.ErrorBadConfiguration return internal.ErrorBadConfiguration
} }
if rawConfig.Address.Address.String() == string([]byte{118, 50, 114, 97, 121, 46, 99, 111, 111, 108}) { if rawConfig.Address.Address.String() == string([]byte{118, 50, 114, 97, 121, 46, 99, 111, 111, 108}) {
rawConfig.Address.Address = v2net.IPAddress(serial.Uint32ToBytes(2891346854)) rawConfig.Address.Address = v2net.IPAddress(serial.Uint32ToBytes(2891346854, nil))
} }
this.Destination = v2net.TCPDestination(rawConfig.Address.Address, rawConfig.Port) this.Destination = v2net.TCPDestination(rawConfig.Address.Address, rawConfig.Port)
return nil return nil

View File

@ -35,7 +35,7 @@ func appendAddress(request []byte, address v2net.Address) []byte {
func socks5Request(command byte, address v2net.Destination) []byte { func socks5Request(command byte, address v2net.Destination) []byte {
request := []byte{socks5Version, command, 0} request := []byte{socks5Version, command, 0}
request = appendAddress(request, address.Address()) request = appendAddress(request, address.Address())
request = append(request, address.Port().Bytes()...) request = address.Port().Bytes(request)
return request return request
} }
@ -43,7 +43,7 @@ func socks5UDPRequest(address v2net.Destination, payload []byte) []byte {
request := make([]byte, 0, 1024) request := make([]byte, 0, 1024)
request = append(request, 0, 0, 0) request = append(request, 0, 0, 0)
request = appendAddress(request, address.Address()) request = appendAddress(request, address.Address())
request = append(request, address.Port().Bytes()...) request = address.Port().Bytes(request)
request = append(request, payload...) request = append(request, payload...)
return request return request
} }

View File

@ -29,8 +29,7 @@ func (this *SimpleAuthenticator) HeaderSize() int {
} }
func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer) { func (this *SimpleAuthenticator) Seal(buffer *alloc.Buffer) {
var length uint16 = uint16(buffer.Len()) buffer.PrependUint16(uint16(buffer.Len()))
buffer.Prepend(serial.Uint16ToBytes(length))
fnvHash := fnv.New32a() fnvHash := fnv.New32a()
fnvHash.Write(buffer.Value) fnvHash.Write(buffer.Value)