github.com/cristalhq/base64@v0.1.2/utils.go (about) 1 package base64 2 3 import ( 4 "math" 5 "unsafe" 6 ) 7 8 type sliceHeader struct { 9 data uintptr 10 len int 11 cap int 12 } 13 14 type stringHeader struct { 15 data uintptr 16 len int 17 } 18 19 func b2s(value []byte) string { 20 return *(*string)(unsafe.Pointer(&value)) 21 } 22 23 func s2b(value string) (b []byte) { 24 bh := (*sliceHeader)(unsafe.Pointer(&b)) 25 sh := (*stringHeader)(unsafe.Pointer(&value)) 26 bh.data = sh.data 27 bh.len = sh.len 28 bh.cap = sh.len 29 return b 30 } 31 32 func makeLuts(lutSe [64]byte) ([4096]uint32, [256]uint32, [256]uint32, [256]uint32, [256]uint32) { 33 lutXe := [4096]uint32{} 34 lutXd0 := [256]uint32{} 35 lutXd1 := [256]uint32{} 36 lutXd2 := [256]uint32{} 37 lutXd3 := [256]uint32{} 38 for i := 0; i < 256; i++ { 39 lutXd0[i] = math.MaxUint32 40 lutXd1[i] = math.MaxUint32 41 lutXd2[i] = math.MaxUint32 42 lutXd3[i] = math.MaxUint32 43 } 44 for i, ichar := range lutSe { 45 for j, jchar := range lutSe { 46 lutXe[j+i*64] = uint32(ichar) | uint32(jchar)<<8 47 } 48 lutXd0[ichar] = uint32(i * 4) 49 d1 := uint32(i * 16) 50 lutXd1[ichar] = (d1<<8)&0x0000FF00 | (d1>>8)&0x00000000FF 51 d2 := uint32(i * 64) 52 lutXd2[ichar] = (d2<<16)&0x00FF0000 | d2&0x0000FF00 53 lutXd3[ichar] = uint32(i) << 16 54 } 55 return lutXe, lutXd0, lutXd1, lutXd2, lutXd3 56 } 57 58 var ( 59 stdLutSe = [64]byte{ 60 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 61 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 62 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 63 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '+', '/', 64 } 65 urlLutSe = [64]byte{ 66 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 67 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f', 68 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 69 'w', 'x', 'y', 'z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '-', '_', 70 } 71 )