Go 按位不知道没有FFFFFF怎么办
当按位执行not时,会得到很多ffffffff。如何正确做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
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()
不会添加前导十六进制零),该动词也会添加前导零:
这输出相同的结果。试一下上面的例子