golang(Go语言) byte/[]byte 与 二进制形式字符串 互转

前端之家收集整理的这篇文章主要介绍了golang(Go语言) byte/[]byte 与 二进制形式字符串 互转前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

效果

把某个字节或字节数组转换成字符串01的形式,一个字节用8个”0”或”1”字符表示。比如:
byte(3) –> “00000011”
[]byte{1,2,3} –> “[00000001 00000010 00000011]”
“[00000011 10000000]” –> []byte{0x3,0x80}

开源库 biu

实际上我已经将其封装到一个开源库了(biu),其中的一个功能就能达到上述效果

  1. //byte/[]byte -> string
  2. bs := []byte{1, 2, 3}
  3. s := biu.BytesToBinaryString(bs)
  4. fmt.Println(s) //[00000001 00000010 00000011]
  5. fmt.Println(biu.ByteToBinaryString(byte(3))) //00000011
  6.  
  7. //string -> []byte
  8. s := "[00000011 10000000]"
  9. bs := biu.BinaryStringToBytes(s)
  10. fmt.Printf("%#v\n",bs) //[]byte{0x3,0x80}

代码实现

  1. const (
  2. zero = byte('0')
  3. one = byte('1')
  4. lsb = byte('[') // left square brackets
  5. rsb = byte(']') // right square brackets
  6. space = byte(' ')
  7. )
  8.  
  9. var uint8arr [8]uint8
  10.  
  11. // ErrBadStringFormat represents a error of input string's format is illegal .
  12. var ErrBadStringFormat = errors.New("bad string format")
  13.  
  14. // ErrEmptyString represents a error of empty input string.
  15. var ErrEmptyString = errors.New("empty string")
  16.  
  17.  
  18. func init() {
  19. uint8arr[0] = 128
  20. uint8arr[1] = 64
  21. uint8arr[2] = 32
  22. uint8arr[3] = 16
  23. uint8arr[4] = 8
  24. uint8arr[5] = 4
  25. uint8arr[6] = 2
  26. uint8arr[7] = 1
  27. }
  28.  
  29. // append bytes of string in binary format.
  30. func appendBinaryString(bs []byte,b byte) []byte {
  31. var a byte
  32. for i := 0; i < 8; i++ {
  33. a = b
  34. b <<= 1
  35. b >>= 1
  36. switch a {
  37. case b:
  38. bs = append(bs,zero)
  39. default:
  40. bs = append(bs,one)
  41. }
  42. b <<= 1
  43. }
  44. return bs
  45. }
  46.  
  47.  
  48. // ByteToBinaryString get the string in binary format of a byte or uint8.
  49. func ByteToBinaryString(b byte) string {
  50. buf := make([]byte, 0, 8)
  51. buf = appendBinaryString(buf,b)
  52. return string(buf)
  53. }
  54.  
  55. // BytesToBinaryString get the string in binary format of a []byte or []int8.
  56. func BytesToBinaryString(bs []byte) string {
  57. l := len(bs)
  58. bl := l*8 + l + 1
  59. buf := make([]byte,bl)
  60. buf = append(buf,lsb)
  61. for _,b := range bs {
  62. buf = appendBinaryString(buf,b)
  63. buf = append(buf,space)
  64. }
  65. buf[bl-1] = rsb
  66. return string(buf)
  67. }
  68.  
  69. // regex for delete useless string which is going to be in binary format.
  70. var rbDel = regexp.MustCompile(`[^01]`)
  71.  
  72. // BinaryStringToBytes get the binary bytes according to the
  73. // input string which is in binary format.
  74. func BinaryStringToBytes(s string) (bs []byte) {
  75. if len(s) == 0 {
  76. panic(ErrEmptyString)
  77. }
  78.  
  79. s = rbDel.ReplaceAllString(s,"")
  80. l := len(s)
  81. if l == 0 {
  82. panic(ErrBadStringFormat)
  83. }
  84.  
  85. mo := l % 8
  86. l /= 8
  87. if mo != 0 {
  88. l++
  89. }
  90. bs = make([]byte,l)
  91. mo = 8 - mo
  92. var n uint8
  93. for i,b := range []byte(s) {
  94. m := (i + mo) % 8
  95. switch b {
  96. case one:
  97. n += uint8arr[m]
  98. }
  99. if m == 7 {
  100. bs = append(bs,n)
  101. n = 0
  102. }
  103. }
  104. return
  105. }

猜你在找的Go相关文章