如何将这些(十六进制)数字转换为 Golang 中的字符?
How to convert these (hex) numbers to characters in Golang?
我通过无线电芯片接收到一些字符,我尝试从串行端口读取这些字符。我可以在 this Python code 中很好地阅读它,这给了我这个:
received: counter: 2703
received: counter: 2704
received: counter: 2705
所以使用 go-serial package 我写了一些代码在 Go 中做同样的事情:
package main
import "fmt"
import "log"
import "github.com/jacobsa/go-serial/serial"
import "io"
import "encoding/hex"
func main() {
// Set up options.
options := serial.OpenOptions{
PortName: "/dev/ttyUSB0",
BaudRate: 9600,
DataBits: 7,
StopBits: 2,
MinimumReadSize: 4,
}
// Open the port.
port, err := serial.Open(options)
if err != nil {
log.Fatalf("serial.Open: %v", err)
}
defer port.Close()
for {
buf := make([]byte, 32)
n, err := port.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Println("Error reading from serial port: ", err)
}
} else {
buf = buf[:n]
fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))
}
}
}
如您所见,我打印了接收到的原始缓冲区和从十六进制转换为字符串的缓冲区。结果是这样的:
received: [99 111 117 110 116 101 114 58 32 51 48 50 52 10]
received: 636f756e7465723a20333032340a
received: [99 111 117 110 116 101 114 58 32 51 48 50 53 10]
received: 636f756e7465723a20333032350a
received: [99 111 117 110 116 101 114 58 32 51 48 50 54 10]
received: 636f756e7465723a20333032360a
我猜这些数字代表 counter: 2704
,但如您所见,转换为字符串并没有给我预期的结果。
有人知道我做错了什么吗?如何将这些数字转换为字符串?欢迎所有提示!
我发现解决方法很简单。而不是这些:
fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))
我只需要这样做:
fmt.Println("received: ", string(buf))
输入的文本已经是有效字符串。只是您将字节存储在 buf
中,即 []byte
。将现有的 []byte
转换为 string
类型的值:
asString := string(buf)
虽然hex.EncodeToString
returns一个字符串,它returns每个字节的十六进制表示。例如,小写 c
的 UTF-8 / ASCII,代码 99 十进制,是 0x63
,所以 hex.EncodeToString
的前两个字符是 6
和 3
.
(与此同时,您应该弄清楚如何处理实际错误。您的代码当前会忽略它们,在宣布任何不是 io.EOF
之后。如果您的设备进入错误状态,您将循环又一次得到同样的错误。)
我通过无线电芯片接收到一些字符,我尝试从串行端口读取这些字符。我可以在 this Python code 中很好地阅读它,这给了我这个:
received: counter: 2703
received: counter: 2704
received: counter: 2705
所以使用 go-serial package 我写了一些代码在 Go 中做同样的事情:
package main
import "fmt"
import "log"
import "github.com/jacobsa/go-serial/serial"
import "io"
import "encoding/hex"
func main() {
// Set up options.
options := serial.OpenOptions{
PortName: "/dev/ttyUSB0",
BaudRate: 9600,
DataBits: 7,
StopBits: 2,
MinimumReadSize: 4,
}
// Open the port.
port, err := serial.Open(options)
if err != nil {
log.Fatalf("serial.Open: %v", err)
}
defer port.Close()
for {
buf := make([]byte, 32)
n, err := port.Read(buf)
if err != nil {
if err != io.EOF {
fmt.Println("Error reading from serial port: ", err)
}
} else {
buf = buf[:n]
fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))
}
}
}
如您所见,我打印了接收到的原始缓冲区和从十六进制转换为字符串的缓冲区。结果是这样的:
received: [99 111 117 110 116 101 114 58 32 51 48 50 52 10]
received: 636f756e7465723a20333032340a
received: [99 111 117 110 116 101 114 58 32 51 48 50 53 10]
received: 636f756e7465723a20333032350a
received: [99 111 117 110 116 101 114 58 32 51 48 50 54 10]
received: 636f756e7465723a20333032360a
我猜这些数字代表 counter: 2704
,但如您所见,转换为字符串并没有给我预期的结果。
有人知道我做错了什么吗?如何将这些数字转换为字符串?欢迎所有提示!
我发现解决方法很简单。而不是这些:
fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))
我只需要这样做:
fmt.Println("received: ", string(buf))
输入的文本已经是有效字符串。只是您将字节存储在 buf
中,即 []byte
。将现有的 []byte
转换为 string
类型的值:
asString := string(buf)
虽然hex.EncodeToString
returns一个字符串,它returns每个字节的十六进制表示。例如,小写 c
的 UTF-8 / ASCII,代码 99 十进制,是 0x63
,所以 hex.EncodeToString
的前两个字符是 6
和 3
.
(与此同时,您应该弄清楚如何处理实际错误。您的代码当前会忽略它们,在宣布任何不是 io.EOF
之后。如果您的设备进入错误状态,您将循环又一次得到同样的错误。)