main.go 1.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package yu_fast
  2. import (
  3. "unsafe"
  4. )
  5. // B2S
  6. //
  7. // @Description: 在没有内存分配的情况下将字节片转换为字符串
  8. func B2S(b []byte) string {
  9. return *(*string)(unsafe.Pointer(&b))
  10. }
  11. type sliceHeader struct {
  12. data uintptr
  13. len int
  14. cap int
  15. }
  16. type stringHeader struct {
  17. data uintptr
  18. len int
  19. }
  20. // S2B
  21. //
  22. // @Description: 在没有内存分配的情况下将字符串转换为字节片
  23. func S2B(s string) (b []byte) {
  24. bh := (*sliceHeader)(unsafe.Pointer(&b))
  25. sh := (*stringHeader)(unsafe.Pointer(&s))
  26. bh.data = sh.data
  27. bh.len = sh.len
  28. bh.cap = sh.len
  29. return
  30. return *(*[]byte)(unsafe.Pointer(&s))
  31. }
  32. // P2B
  33. //
  34. // @Description: 指针转[]byte
  35. // @param ptr 数据指针
  36. // @param size 数据尺寸
  37. // @return []byte 转换结果
  38. func P2B[T int | uintptr](ptr T, size T) []byte {
  39. j_bufs := make([]byte, size)
  40. copy(j_bufs, *(*[]byte)(unsafe.Pointer(&[3]uintptr{uintptr(ptr), uintptr(size), uintptr(size)})))
  41. return j_bufs
  42. }
  43. // P2S
  44. //
  45. // @Description: 指针转 string
  46. // @param ptr 数据指针
  47. // @param size 数据尺寸
  48. // @return []byte 转换结果
  49. func P2S[T int | uintptr](ptr T, size T) string {
  50. return string(P2B(ptr, size))
  51. }