为了账号安全,请及时绑定邮箱和手机立即绑定

按位不对没有ffffffff怎么办

按位不对没有ffffffff怎么办

Go
喵喵时光机 2023-08-14 17:15:30
当执行按位非时,会得到很多 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上的示例。


查看完整回答
反对 回复 2023-08-14
  • 1 回答
  • 0 关注
  • 120 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信