猿问

按位不至于没有 ffffffff 怎么办

当按位不做时,得到很多 ffffffff。如何正确做?


    space := "    "

    str := "12345678999298765432179.170.184.81"


    sp := len(str) % 4

    if sp > 0 {

        str = str + space[0:4-sp]

    }

    fmt.Println(str, len(str))


    hx := hex.EncodeToString([]byte(str))

    ln := len(hx)

    a, _ := strconv.ParseUint(hx[0:8], 16, 0)

    for i := 8; i < ln; i += 8 {

        b, _ := strconv.ParseUint(hx[i:i+8], 16, 0)

        a = a ^ b

    }


    xh := strconv.FormatUint(^a, 16)

    fmt.Println(xh)

输出 ffffffffc7c7dbcb


我只需要 c7c7dbcb


繁星淼淼
浏览 177回答 1
1回答

哈士奇WWW

您获得了很多领先优势ff,因为您的a数字实际上只是 32 位“大”,但在 64 位uint64值“内”使用。(您正在处理具有 8 个十六进制数字 = 4 字节数据 = 32 位的数字。)它有 4 个前导 0 字节,当取反时将变成ff.&nbsp;您可以通过以下方式验证这一点:fmt.Printf("a&nbsp;%#x\n",a)输出:a&nbsp;0x38382434要摆脱那些领先ff,将结果转换为uint32:xh&nbsp;:=&nbsp;strconv.FormatUint(uint64(uint32(^a)),&nbsp;16) fmt.Println(xh)(转换回uint64是因为strconv.FormatUint()期望/需要uint64。)这输出:c7c7dbcb另一种选择是应用0xffffffff位掩码:xh&nbsp;=&nbsp;strconv.FormatUint(^a&0xffffffff,&nbsp;16) fmt.Println(xh)另请注意,您可以使用fmt.Printf()(或者fmt.Sprintf()如果您需要将其作为 a&nbsp;string)打印它,您可以在其中指定%08x动词,如果输入具有超过 3 个前导 0 位(因此strconv.FormatUint()不会添加前导十六进制零),该动词还会添加前导零:fmt.Printf("%08x",&nbsp;uint32(^a))这输出相同。试试Go Playground上的示例。
随时随地看视频慕课网APP

相关分类

Go
我要回答