按位不知道怎么办没有ffffffff

aka*_*hor 1 go bitwise-operators

当按位不做时,得到很多 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)
Run Code Online (Sandbox Code Playgroud)

输出 ffffffffc7c7dbcb

我只需要 c7c7dbcb

icz*_*cza 5

你得到了很多领先,ff因为你的a数字实际上只有 32 位“大”,但在 64 位uint64值“内”使用。(您正在处理具有 8 个十六进制数字 = 4 个字节数据 = 32 位的数字。)它有 4 个前导 0 字节,当否定时将变成ff. 您可以通过以下方式验证:

fmt.Printf("a %#x\n",a)
Run Code Online (Sandbox Code Playgroud)

输出:

a 0x38382434
Run Code Online (Sandbox Code Playgroud)

要摆脱那些领先的ff,请将结果转换为uint32

xh := strconv.FormatUint(uint64(uint32(^a)), 16)
fmt.Println(xh)
Run Code Online (Sandbox Code Playgroud)

(转换回uint64是因为strconv.FormatUint()expects / requires uint64。)

这输出:

c7c7dbcb
Run Code Online (Sandbox Code Playgroud)

另一种选择是应用0xffffffff位掩码:

xh = strconv.FormatUint(^a&0xffffffff, 16)
fmt.Println(xh)
Run Code Online (Sandbox Code Playgroud)

另请注意,您可以使用fmt.Printf()(或者fmt.Sprintf()如果您需要它作为 a string)打印它,您可以在其中指定%08x动词,如果输入具有超过 3 个前导 0 位(因此strconv.FormatUint()不会添加前导十六进制零),它还添加前导零:

fmt.Printf("%08x", uint32(^a))
Run Code Online (Sandbox Code Playgroud)

这输出相同。试试Go Playground上的例子。