当执行按位非时,会得到很多 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
1 回答
慕丝7291255
TA贡献1859条经验 获得超6个赞
您会得到很多前导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
是因为strconv.FormatUint()
期望/需要uint64
。)
这输出:
c7c7dbcb
另一种选择是应用位0xffffffff
掩码:
xh = strconv.FormatUint(^a&0xffffffff, 16) fmt.Println(xh)
另请注意,您可以使用fmt.Printf()
(或者fmt.Sprintf()
如果您需要它作为 a string
)打印它,其中您指定%08x
动词,如果输入具有超过 3 个前导 0 位,该动词也会添加前导零(因此strconv.FormatUint()
不会添加前导十六进制零):
fmt.Printf("%08x", uint32(^a))
这输出相同。尝试Go Playground上的示例。
- 1 回答
- 0 关注
- 125 浏览
添加回答
举报
0/150
提交
取消