package main import ( "bytes" "fmt" "os" "strings" "strconv" ) func bitStringToBytes(s string) ([]byte, error) { size := 8 ss := make([]string, 0, len(s)/size+1) for len(s) > 0 { if len(s) < size { size = len(s) } ss, s = append(ss, s[:size]), s[size:] } var buf bytes.Buffer for _, bs := range ss { n, err := strconv.ParseUint(bs, 2, 8) if err != nil { return nil, err } buf.WriteByte(byte(n)) } return buf.Bytes(), nil } func bytesToBitString(b []byte) string { s := fmt.Sprintf("%08b", b) return strings.ReplaceAll(s[1:len(s)-1], " ", "") } func main() { s := "Hello, playground" fmt.Printf("\nstring\n%s\n%b\n\n", s, []byte(s)) bitstr := bytesToBitString([]byte(s)) fmt.Printf("\nbitstring\n%s\n\n", bitstr) b, err := bitStringToBytes(bitstr) if err != nil { fmt.Println(err) os.Exit(1) } fmt.Println(string(b)) }