如何在Golang中将这些(十六进制)数字转换为字符?

问题描述 投票:0回答:3

我通过无线电芯片接收到一些字符,尝试从串行端口读取这些字符。我可以在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,但是正如您所看到的,转换为字符串并没有得到我期望的结果。

有人知道我在这里做错了吗?如何将这些数字转换为字符串?欢迎所有提示!

python go hex decode
3个回答
0
投票

使用

txt = "".join(chr(val) for val in buffer)
print(txt)

0
投票

好吧,我花了一些时间才发现解决方案非常简单。代替以下任何一个:

fmt.Println("received: ", buf)
fmt.Println("received: ", hex.EncodeToString(buf))

我只需要这样做:

fmt.Println("received: ", string(buf))

我希望这可以帮助其他遇到相同问题的人。祝大家有美好的一天。


0
投票

输入的文本已经是有效的字符串。只是将字节存储在buf中。将现有的[]byte转换为[]byte类型的值:

string

虽然asString := string(buf) 返回一个字符串,但它返回每个字节的十六进制表示形式。例如,小写代码hex.EncodeToString的UTF-8 / ASCII(十进制代码99)为c,因此0x63的前两个字符为hex.EncodeToString6

(同时,您应该弄清楚如何处理实际错误。在宣布不属于3的任何错误之后,当前代码将忽略它们。如果您的设备进入错误状态,则将一遍又一遍地循环获取相同的错误。)

© www.soinside.com 2019 - 2024. All rights reserved.