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  )