使用Fprintf

要求:我想发送“ 4个字节”-当我发送以下十六进制消息时-我看到它们在处理一个十六进制消息时起作用,而在进行较小的更改后不能用于另一个十六进制消息

以下代码更好地解释了我的问题-首先按预期方式发送了4个字节的工作十六进制,其次发送了额外字节的另一个hex消息-我需要找出一种方法也可以为第二个十六进制发送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,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套接字发送此消息,但是对于上面的示例-我将相同的十六进制消息发送给stdout,以便我们轻松查看。只要该解决方案可用于向套接字发送信息-我真的不关心它的Fprintf还是其他

yeluogui1236 回答:使用Fprintf

如果查看打印的字符串,您会发现问题:

Br%!(NOVERB)

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

本文链接:https://www.f2er.com/3168994.html

大家都在问