亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將一個簡單的哈希函數從 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 關注
  • 146 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號