Go 按位不知道没有FFFFFF怎么办

Go 按位不知道没有FFFFFF怎么办,go,bitwise-operators,Go,Bitwise Operators,当按位执行not时,会得到很多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(s

当按位执行not时,会得到很多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)
空格:=“”
str:=“1234567899298765432179.170.184.81”
sp:=len(str)%4
如果sp>0{
str=str+space[0:4-sp]
}
fmt.Println(str,len(str))
hx:=十六进制编码字符串([]字节(str))
ln:=len(hx)
a、 _u:=strconv.ParseUint(hx[0:8],16,0)
对于i:=8;i
输出 ffffffffc7c7dbcb

我只需要
c7c7dbcb

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

fmt.Printf("a %#x\n",a)
产出:

a 0x38382434
要除去那些前导的
ff
,请将结果转换为
uint32

xh := strconv.FormatUint(uint64(uint32(^a)), 16)
fmt.Println(xh)
(转换回
uint64
是因为需要
uint64

这将产生:

c7c7dbcb
另一个选项是应用
0xffffffff
位掩码:

xh = strconv.FormatUint(^a&0xffffffff, 16)
fmt.Println(xh)
还请注意,您可以使用(或者如果需要将其作为
字符串
)打印,其中指定
%08x
动词,如果输入的前导0位超过3位(因此
strconv.FormatUint()
不会添加前导十六进制零),该动词也会添加前导零:


这输出相同的结果。请尝试上的示例。

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

fmt.Printf("a %#x\n",a)
产出:

a 0x38382434
要除去那些前导的
ff
,请将结果转换为
uint32

xh := strconv.FormatUint(uint64(uint32(^a)), 16)
fmt.Println(xh)
(转换回
uint64
是因为需要
uint64

这将产生:

c7c7dbcb
另一个选项是应用
0xffffffff
位掩码:

xh = strconv.FormatUint(^a&0xffffffff, 16)
fmt.Println(xh)
还请注意,您可以使用(或者如果需要将其作为
字符串
)打印,其中指定
%08x
动词,如果输入的前导0位超过3位(因此
strconv.FormatUint()
不会添加前导十六进制零),该动词也会添加前导零:

这输出相同的结果。试一下上面的例子