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

将一个简单的哈希函数从 c 转换为 go

将一个简单的哈希函数从 c 转换为 go

Go
慕森卡 2023-03-21 16:01:19
我正在尝试将一个简单的哈希函数从 C 转换为 Go。这些 C 和 Go 脚本之间有什么区别,我该如何修复 Go 代码?C -> 结果为 {FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|124A}int   sum;char* pChar;char  s[8];msg = "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"sum = 0;pChar = msg + 1; // sum starts after the opening {while (*pChar != 0) {  sum += (int)*pChar++;}sprintf(s, "%04X}", sum);strcat(msg, s);转到 -> 结果为 {FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|004A}msg := "{FB;01;4C|64:KDY;KMT;KYR;KT0;TKK;PAC;UD01;UD02;UD03;ID01;ID02;ID03;SYS|"var sum uint8for i := 1; i < len(msg); i++ {    sum += msg[i]}s := fmt.Sprintf("%04X}", sum)req := strings.Join([]string{msg, s}, "")fmt.Println(req)
查看完整描述

2 回答

?
沧海一幻觉

TA贡献1824条经验 获得超5个赞

您需要将“var sum”设为“uint16”,否则它永远不会超过 00FF。



查看完整回答
反对 回复 2023-03-21
?
猛跑小猪

TA贡献1858条经验 获得超8个赞

在您的 C 代码中,的类型sum是,它是大小为1int的至少 16 位的有符号整数类型。

然而,你的 Go 代码中的类型sum是一个限制为 8 位的无符号整数类型。uint8

根据您的 format string 判断%04X},您可能需要一个 16 位值。

要修复 Go 代码,只需更改uint8int使用sum += int(msg[i])以使编译器满意。如果要sum严格保留 16 位的值,可以改用uint16and sum += uint16(msg[i])

如果您想知道为什么需要包装msg[i]uint16(...)那是因为您要将值转换为不同的类型。C 具有“整数提升”规则,可自动将宽度小于的值转换int为类型的值int。然而,Go 没有这样的规则,只是拒绝编译,声明类型不兼容。


顺便说一句,由于它的自动内存管理,你可以简单地在你的 Go 代码中这样做:

req := msg + fmt.Sprintf("%04X}", sum)
fmt.Println(req)

甚至:

s := fmt.Sprintf("%04X}", sum)
fmt.Println(msg + sum)

您当前的方法没有问题;这只是额外的冗长。


1 int要求在 C 中至少是 16 位,在 Go 中至少是 32 位,但现在这两种语言通常都是 32 位。但是,您应该知道,它在某些当前系统上可能是 64 位的,并且在将来的某个时候对于任何一种语言都可能默认为 64 位;他们不需要保持数据类型大小同步。添加值时应牢记这一点,msg以确保 的值为sum16 位(或仅使用uint16)。


查看完整回答
反对 回复 2023-03-21
  • 2 回答
  • 0 关注
  • 94 浏览
慕课专栏
更多

添加回答

举报

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