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

要求:我想得到“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/UNLsLdLk6g0

import (

    "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))


}

产生以下输出,这不是预期的,即使打印时的字节看起来是 4


13 bytes written.

[66 20 114 37]

00000000  42 14 72 25                                       |B.r%|

在第二个示例中需要发送 4 个字节 - 请帮我解决同样的问题


注意:为什么我在这里使用 Fprintf ?我需要通过 TCP 套接字发送此消息,但对于上面的示例 - 我发送相同的十六进制消息,但发送到标准输出,以便我们轻松查看此消息。只要该解决方案可用于向套接字发送信息 - 我真的不在乎它是 Fprintf 还是其他东西


湖上湖
浏览 97回答 1
1回答

哈士奇WWW

如果您查看打印的字符串,您可以看到问题:Br%!(NOVERB)在这里,当最后一个字节是 0x25(即“%”)时,Fprintf 尝试从输入中读取下一个格式化动词,但该动词不存在,因此它打印出错误消息!(NOVERB)。那是你的额外字节。使用 FPrint 代替 Fprintf,它应该打印 4 个字节。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go