diff --git a/app/cmd/main.go b/app/cmd/main.go index 50845b0..11714b4 100644 --- a/app/cmd/main.go +++ b/app/cmd/main.go @@ -2,6 +2,7 @@ package main import ( "fmt" + "trailblazer2/app/codecs" ) func main() { @@ -10,6 +11,12 @@ func main() { aa = append(aa, 23) fmt.Println(aa) + + a := "asdfasdf" + b := "3c6d08d667d0ee0ccad77c55b19d3e4ab2552f7163ec40a9389095a18f86c398" + + //fmt.Println() + fmt.Println(codecs.Encode(a, b)) } func s(origin string, b bool) (result []int32) { @@ -40,3 +47,27 @@ func getCharAt(data []int32, index int, length int) int32 { return data[index] } } + +func l(a []int32, b bool) (result []int32) { + d := len(a) + + c := d - 1<<2 + + if b { + m := int(a[d-1]) + if m < c-3 || m > c { + return nil + } + c = m + } + + for i := 0; i < d; i++ { + result = append(result, a[i]&0xff, a[i]>>8&0xff, a[i]>>16&0xff, a[i]>>24&0xff) + } + + if b { + return append(result, int32(c)) + } else { + return result + } +} diff --git a/app/codecs/encode.go b/app/codecs/encode.go new file mode 100644 index 0000000..7ce47f5 --- /dev/null +++ b/app/codecs/encode.go @@ -0,0 +1,94 @@ +package codecs + +import "math" + +func Encode(str string, key string) []int32 { + v := magicEncode(str, true) + k := magicEncode(key, false) + + if len(k) < 4 { + + } + + n := len(v) - 1 + z := int(v[n]) + y := int(v[0]) + c := -1640531527 + q := math.Floor(float64(6 + 52/(n+1))) + d := 0 + var m, e, p int + + for ; q > 0; q-- { + d = d + c&(-1) + e = d >> 2 & 3 + + for i := 0; i < n; i++ { + y = int(v[p+1]) + m = z>>5 ^ y<<2 + m += y>>3 ^ z<<4 ^ (d ^ y) + m += int(k[p&3^e]) ^ z + v[p] = v[p] + int32(m&(-1)) + z = int(v[p]) + } + + y = int(v[0]) + m = z>>5 ^ y<<2 + m += y>>3 ^ z<<4 ^ (d ^ y) + m += int(k[p&3^e]) ^ z + v[n] = v[n] + int32(m&(0xBB390742|0x44C6F8BD)) + z = int(v[n]) + } + + return magicDecode(v, false) +} + +func magicEncode(source string, sizeOnLast bool) (result []int32) { + data := []int32(source) + dataLen := len(data) + + resultLen := dataLen / 4 + if sizeOnLast { + result = make([]int32, resultLen+1) + result[resultLen] = int32(dataLen) + } else { + result = make([]int32, resultLen) + } + + for i := 0; i < dataLen; i += 4 { + result[i>>2] = get(data, i, dataLen) | get(data, i+1, dataLen)<<8 | get(data, i+2, dataLen)<<16 | get(data, i+3, dataLen)<<24 + } + + return result +} + +func magicDecode(data []int32, sizeOnLast bool) (result []int32) { + dataLength := len(data) + + c := dataLength - 1<<2 + + if sizeOnLast { + m := int(data[dataLength-1]) + if m < c-3 || m > c { + return nil + } + c = m + } + + for i := 0; i < dataLength; i++ { + result = append(result, data[i]&0xff, data[i]>>8&0xff, data[i]>>16&0xff, data[i]>>24&0xff) + } + + if sizeOnLast { + return append(result, int32(c)) + } else { + return result + } +} + +func get(data []int32, index int, length int) int32 { + if index >= length { + return 0 + } else { + return data[index] + } +} diff --git a/app/encode/encode.go b/app/encode/encode.go deleted file mode 100644 index 1069d65..0000000 --- a/app/encode/encode.go +++ /dev/null @@ -1,48 +0,0 @@ -package encode - -//func XEncode(str string, key string) string { -// -//} - -func s(origin string, b bool) (result []int32) { - data := []int32(origin) - dataLen := len(origin) - - resultLen := (dataLen / 4) + 1 - if b { - result = make([]int32, resultLen+1) - result[resultLen] = int32(resultLen) - } else { - result = make([]int32, resultLen) - } - - for i := 0; i < dataLen; i += 4 { - result[i>>2] = get(data, i, dataLen) | get(data, i+1, dataLen)<<8 | get(data, i+2, dataLen)<<16 | get(data, i+3, dataLen)<<24 - } - - return result -} - -// -//func l(a string, b bool) (result []int32) { -// d := len(a) -// data := []int32(a) -// -// c := d - 1<<2 -// -// if b { -// m := int(data[d-1]) -// if m < c-3 || m > c { -// return nil -// } -// c = m -// } -//} - -func get(data []int32, index int, length int) int32 { - if index >= length { - return 0 - } else { - return data[index] - } -}