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

我正在尝试将一个简单的哈希函数从 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 uint8

for i := 1; i < len(msg); i++ {

    sum += msg[i]

}

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

req := strings.Join([]string{msg, s}, "")

fmt.Println(req)


慕森卡
浏览 95回答 2
2回答

沧海一幻觉

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

猛跑小猪

在您的 C 代码中,的类型sum是,它是大小为1int的至少 16 位的有符号整数类型。然而,你的 Go 代码中的类型sum是一个限制为 8 位的无符号整数类型。uint8根据您的 format string 判断%04X},您可能需要一个 16 位值。要修复 Go 代码,只需更改uint8并int使用sum += int(msg[i])以使编译器满意。如果要sum严格保留 16 位的值,可以改用uint16and&nbsp;sum += uint16(msg[i])。如果您想知道为什么需要包装msg[i],uint16(...)那是因为您要将值转换为不同的类型。C 具有“整数提升”规则,可自动将宽度小于的值转换int为类型的值int。然而,Go 没有这样的规则,只是拒绝编译,声明类型不兼容。顺便说一句,由于它的自动内存管理,你可以简单地在你的 Go 代码中这样做:req&nbsp;:=&nbsp;msg&nbsp;+&nbsp;fmt.Sprintf("%04X}",&nbsp;sum) fmt.Println(req)甚至:s&nbsp;:=&nbsp;fmt.Sprintf("%04X}",&nbsp;sum) fmt.Println(msg&nbsp;+&nbsp;sum)您当前的方法没有问题;这只是额外的冗长。1&nbsp;int要求在 C 中至少是 16 位,在 Go 中至少是 32 位,但现在这两种语言通常都是 32 位。但是,您应该知道,它在某些当前系统上可能是 64 位的,并且在将来的某个时候对于任何一种语言都可能默认为 64 位;他们不需要保持数据类型大小同步。添加值时应牢记这一点,msg以确保 的值为sum16 位(或仅使用uint16)。
打开App,查看更多内容
随时随地看视频慕课网APP