github.com/zhiqiangxu/util@v0.0.0-20230112053021-0a7aee056cd5/bytes/aligned.go (about)

     1  package bytes
     2  
     3  import "unsafe"
     4  
     5  const (
     6  	// Align4Mask for 4 bytes boundary
     7  	Align4Mask = 3
     8  	// Align8Mask for 8 bytes boundary
     9  	Align8Mask = 7
    10  )
    11  
    12  // AlignedTo4 returns a byte slice aligned to 4 bytes boundary
    13  func AlignedTo4(n uint32) []byte {
    14  	buf := make([]byte, int(n)+Align4Mask)
    15  	buf0Alignment := uint32(uintptr(unsafe.Pointer(&buf[0]))) & uint32(Align4Mask)
    16  	buf = buf[buf0Alignment : buf0Alignment+n]
    17  	return buf
    18  }
    19  
    20  // AlignedTo8 returns a byte slice aligned to 8 bytes boundary
    21  func AlignedTo8(n uint32) []byte {
    22  	buf := make([]byte, int(n)+Align8Mask)
    23  	// return buf
    24  	buf0Alignment := uint32(uintptr(unsafe.Pointer(&buf[0]))) & uint32(Align8Mask)
    25  	buf = buf[buf0Alignment : buf0Alignment+n]
    26  	return buf
    27  }