我正在嘗試將一個簡單的哈希函數從 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 關注
- 146 瀏覽
添加回答
舉報
0/150
提交
取消