为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Fprintf 时发送的字节数差异

使用 Fprintf 时发送的字节数差异

Go
湖上湖 2023-07-31 16:55:37
要求:我想得到“4 个字节已发送” - 当我发送以下十六进制消息时 - 我看到它们适用于一个十六进制消息,但在发送时进行微小更改时不适用于另一个十六进制消息下面的代码更好地解释了我的问题 - 首先是按预期发送了 4 个字节的工作十六进制,第二个是发送额外字节的另一个十六进制消息 - 我也需要找出一种方法来为第二个十六进制发送 4 个字节工作六角形:import (    "fmt"    "os"    "encoding/hex")func main() {    hexString, _ := hex.DecodeString("4214722e")    n, err := fmt.Fprintf(os.Stdout, string(hexString))    // The n and err return values from Fprintf are    // those returned by the underlying io.Writer.    if err != nil {        fmt.Fprintf(os.Stderr, "Fprintf: %v\n", err)    }    fmt.Printf("\n%d bytes written.\n", n)    fmt.Println([]byte(hexString))    fmt.Println(hex.Dump(hexString))}产生以下输出:4 bytes written.[66 20 114 46]00000000  42 14 72 2e                                       |B.r.|无法使用十六进制 - 仅更改了一个值:(这里需要 4 个字节,但我得到了 13)https://play.golang.org/p/UNLsLdLk6g0import (    "fmt"    "os"    "encoding/hex")func main() {    hexString, _ := hex.DecodeString("42147225")    n, err := fmt.Fprintf(os.Stdout, string(hexString))    // The n and err return values from Fprintf are    // those returned by the underlying io.Writer.    if err != nil {        fmt.Fprintf(os.Stderr, "Fprintf: %v\n", err)    }    fmt.Printf("\n%d bytes written.\n", n)    fmt.Println([]byte(hexString))    fmt.Println(hex.Dump(hexString))}产生以下输出,这不是预期的,即使打印时的字节看起来是 413 bytes written.[66 20 114 37]00000000  42 14 72 25                                       |B.r%|在第二个示例中需要发送 4 个字节 - 请帮我解决同样的问题注意:为什么我在这里使用 Fprintf ?我需要通过 TCP 套接字发送此消息,但对于上面的示例 - 我发送相同的十六进制消息,但发送到标准输出,以便我们轻松查看此消息。只要该解决方案可用于向套接字发送信息 - 我真的不在乎它是 Fprintf 还是其他东西
查看完整描述

1 回答

?
哈士奇WWW

TA贡献1799条经验 获得超6个赞

如果您查看打印的字符串,您可以看到问题:

Br%!(NOVERB)

在这里,当最后一个字节是 0x25(即“%”)时,Fprintf 尝试从输入中读取下一个格式化动词,但该动词不存在,因此它打印出错误消息!(NOVERB)。那是你的额外字节。使用 FPrint 代替 Fprintf,它应该打印 4 个字节。


查看完整回答
反对 回复 2023-07-31
  • 1 回答
  • 0 关注
  • 61 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信