我正在尝试将一个简单的哈希函数从 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贡献1858条经验 获得超8个赞
在您的 C 代码中,的类型sum
是,它是大小为1int
的至少 16 位的有符号整数类型。
然而,你的 Go 代码中的类型sum
是一个限制为 8 位的无符号整数类型。uint8
根据您的 format string 判断%04X}
,您可能需要一个 16 位值。
要修复 Go 代码,只需更改uint8
并int
使用sum += int(msg[i])
以使编译器满意。如果要sum
严格保留 16 位的值,可以改用uint16
and 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
以确保 的值为sum
16 位(或仅使用uint16
)。
- 2 回答
- 0 关注
- 126 浏览
添加回答
举报
0/150
提交
取消