如何在golang中将字节数组以二进制形式打印?

12

如何在Golang中将一个字节数组[]byte{255, 253}打印为二进制?

例如,

[]byte{255, 253} --> 1111111111111101

顺便提一下,那是一个切片而不是数组。在Go中,数组是一种实际的数据类型,不同于切片,而不仅仅是一些模糊的类似列表的东西:https://dev59.com/xGgt5IYBdhLWcg3w5har#11737218 - David Jones
3个回答

22

我找到的最简单的方法:

package main

import "fmt"

func main() {
    bs := []byte{0x00, 0xfd}
    for _, n := range(bs) {
        fmt.Printf("%08b ", n) // prints 00000000 11111101
    }
}

使用此代码的游乐场:https://go.dev/play/p/piJV_3OTHae


如果你想要字符串,也可以使用strconv.FormatUint,但是思路相同。 - JimB
1
@JimB 你有一个示例播放区,可以演示使用strconv.FormatUint打印二进制吗? - Pylinux
好的,所以它是 fmt.Printf 的替代品,我本来希望它是 for 循环的替代品 :-) - Pylinux

2

fmt.Printf 可以打印切片和数组,并将格式应用于数组的元素。这避免了循环并使我们非常接近:

package main

import "fmt"

func main() {
    bs := []byte{0xff, 0xfd}
    fmt.Printf("%08b\n", bs) // prints [11111111 11111101]
}

代码示范:https://go.dev/play/p/8RjBJFFI4vf 使用strings.Trim()可以删除切片符号(这是切片表达式的一部分):
fmt.Println(strings.Trim(fmt.Sprintf("%08b", bs), "[]")) // prints 11111111 11111101

1
这是一个非常好的解决方案,谢谢您的添加!我选择它作为被接受的答案。顺便问一下,答案需要字符串.Trim()部分吗?我感觉没有它更简洁。 - Pylinux
我试图让它清晰明了,strings.Trim() 是一个可选的额外操作。 - David Jones
不用在意我,这仍然是一个很棒的答案 :-) - Pylinux

1
或者使用这个简单版本。
func printAsBinary(bytes []byte) {

    for i := 0; i < len(bytes); i++ {
        for j := 0; j < 8; j++ {
            zeroOrOne := bytes[i] >> (7 - j) & 1
            fmt.Printf("%c", '0'+zeroOrOne)
        }
        fmt.Print(" ")
    }
    fmt.Println()
}

[]byte{0, 1, 127, 255} --> 00000000 00000001 01111111 11111111

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接